Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Произвольные данные через TCPSend() / TCPRecv() (http://forum.oszone.net/showthread.php?t=180270)

Intexid 10-07-2010 02:48 1450671

Произвольные данные через TCPSend() / TCPRecv()
 
как с помощью TCPSend/Recv передать файл, а не только текст?
или передать файл как текст, а на входе преобразовать обратно.. такое возможно?

kaster 10-07-2010 10:32 1450726

Intexid, передавать и принимать бинарные данные. чтобы передать
Код:

$hRead = FileOpen($sFile, 16); Флаг 16 - бинарное чтение файла
$xData = FileRead($hRead, $nData); Читаем данные по $nData - байт в цикле

Отправка $xData по TCPSend($socker, $xData)
Прием
Код:

TCPRecv($socket, $nData, 1); флаг 1 - Прием бинарных данных кусками по $nData

Intexid 10-07-2010 13:15 1450773

kaster,
Все работает!!! :yahoo:
а я то думал, это будет целая проблема..

пока только по частям передавать не получается, т.е. файл только целиком.
при указании $nData в файл пишет только первый кусок,
хотя на стороне клиента цикл вроде продолжается..
в связи с этим вопрос: существует ли ограничение на размер данных, отданный одним куском?
с какими флагами на стороне сервера принимать?: FileOpen(), FileWrite()

kaster 10-07-2010 13:55 1450791

Intexid, чесгря я знаком исключительно с концепцией реализации, которую сам написал постом выше. "своими руками" не пробовал. но мне кажется проблем быть не должно. в справке ограничения как таковой нет, но целесообразней и надежней (ИМХО) передавать все же небольшими кусками, особенно если файл большой. на стороне сервера (понял исключительно из контекста где сервер а где клиент) принимать надо по TCPRecv, если я правильно тебя понял. Чтобы записать нужно предварительно открывать файл на запись в бинарном режиме
Код:

$hWrite = FileOpen($sPath, 2 + 16)
и уже потом писать в него по хендлу. либо в конце приема-передачи записать аккумулируюшую переменную, либо в цикле записывать каждый кусок после приема.
скинь свой код, так будет понятнее, что уже сделано а что пропущено или надо дополнить

madmasles 10-07-2010 17:44 1450908

kaster,
Если по частям записывать, то нужно не
Код:

$hWrite = FileOpen($sPath, 2 + 16)
а
Код:

$hWrite = FileOpen($sPath, 1 + 16)

kaster 10-07-2010 17:47 1450910

madmasles, нет. не обязательно. просто не надо хендл закрывать после записи. то что ты говоришь, это дописывание в файл после очередного открытия

madmasles 10-07-2010 17:53 1450912

kaster,
Специально проверил. Я был не прав. Хотя, работает и так и так.


Время: 20:42.

Время: 20:42.
© OSzone.net 2001-