Войти

Показать полную графическую версию : [решено] Произвольные данные через TCPSend() / TCPRecv()


Intexid
10-07-2010, 02:48
как с помощью TCPSend/Recv передать файл, а не только текст?
или передать файл как текст, а на входе преобразовать обратно.. такое возможно?

kaster
10-07-2010, 10:32
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
kaster,
Все работает!!! :yahoo:
а я то думал, это будет целая проблема..

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

kaster
10-07-2010, 13:55
Intexid, чесгря я знаком исключительно с концепцией реализации, которую сам написал постом выше. "своими руками" не пробовал. но мне кажется проблем быть не должно. в справке ограничения как таковой нет, но целесообразней и надежней (ИМХО) передавать все же небольшими кусками, особенно если файл большой. на стороне сервера (понял исключительно из контекста где сервер а где клиент) принимать надо по TCPRecv, если я правильно тебя понял. Чтобы записать нужно предварительно открывать файл на запись в бинарном режиме
$hWrite = FileOpen($sPath, 2 + 16)
и уже потом писать в него по хендлу. либо в конце приема-передачи записать аккумулируюшую переменную, либо в цикле записывать каждый кусок после приема.
скинь свой код, так будет понятнее, что уже сделано а что пропущено или надо дополнить

madmasles
10-07-2010, 17:44
kaster,
Если по частям записывать, то нужно не $hWrite = FileOpen($sPath, 2 + 16)а $hWrite = FileOpen($sPath, 1 + 16)

kaster
10-07-2010, 17:47
madmasles, нет. не обязательно. просто не надо хендл закрывать после записи. то что ты говоришь, это дописывание в файл после очередного открытия

madmasles
10-07-2010, 17:53
kaster,
Специально проверил. Я был не прав. Хотя, работает и так и так.




© OSzone.net 2001-2012