![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уважаемые мастера, подскажите, пожалуйста... [D7, WinXP]
Nord-Ost © (2002-12-10 09:18:00)Если я принимаю данные с помощью команды ReceiveBuf(buf,count), то как выбрать размер буфера, чтобы полностью принять весь пакет информации, переданный сервером? А если не хватит буфера, то не пропадет ли информация и смогу ли я принять оставшуюся часть в следующем пакете? Спасибо.
Nord-Ost (2002-12-10 11:08:00) [1]
> Digitman
Угу, понял, спасибо огромное.
Digitman (2002-12-10 11:04:00) [2]
> А сервер не мой, посему я не могу приказать ему передавать
> длину
Если неизвестен протокол инф.обмена, лучше даже не берись за это дело. Ничего путного не получится.
Но если, например, известно, что сервер В ДАН. МОМЕНТ передает строку, ограниченную терминатором и не имеющую префикса размера, что мешает получить ее ? Буферизуй прием (читая в каждом событии OnRead() данные с пом. ReceiveBuf() во врем.буфер размером не более 4к), анализируй наличие в буфере символа-терминатора строки и добавляй символы слева от терминатора (если он обнаружен, либо - все содержимое врем.буфера) в основной буфер, накапливая таким образом данные, последовательно принятые в нескольких событиях OnRead()
Nord-Ost (2002-12-10 10:46:00) [3]Хе-хе, сам же и ответил :-)
Nord-Ost (2002-12-10 10:44:00) [4]Нет, фиксированной длины они не имеют. А длина определяется из TCP-пакета, она ведь присутствует в заголовке.
savva (2002-12-10 10:35:00) [5]а как же ты собрался считать? ну прочитал ты данные в буфер - что дальше? они что имеют фиксированную длину? если да - то как определить начало?
Nord-Ost (2002-12-10 10:13:00) [6]
> savva
Нет, нету (смотрел сниффером)
savva (2002-12-10 10:07:00) [7]> Nord-Ost © (10.12.02 09:30)
> А сервер не мой, посему я не могу приказать ему передавать
> длину :-(
а признак границы данных какой либо есть?
savva (2002-12-10 10:05:00) [8]в принципе правильно.. но лучще (для меня) сделать так
len:=Socket.ReceiveLength;
recLen:=ReceiveBuf(buf,len);
а дальше сравнивать len и recLen..
Nord-Ost (2002-12-10 09:47:00) [9]Кажись, понял:
ReceiveBuf(buf,Socket.ReceiveLength)
Это правильно?
Nord-Ost (2002-12-10 09:32:00) [10]
> Anatoly Podgoretsky
Вы имете в виду, что при следующем вызове ReceivebBuf я приму следующую порцию, продолжение предыдущей передачи?
Nord-Ost (2002-12-10 09:30:00) [11]
> savva
А сервер не мой, посему я не могу приказать ему передавать длину :-(
Anatoly Podgoretsky (2002-12-10 09:28:00) [12]Зачем тебе об этом беспокоиться, это забота сервера, твое дело принимать
Nord-Ost (2002-12-10 09:25:00) [13]А как сервер узнает, откуда начинать продолжение передачи?
savva (2002-12-10 09:24:00) [14]а он может весь срузу и не прийти:) чтобы узнать скока тебе надо получать есть функция ReceiveLen, которая и возвращает длину буффера на входе.. но это не означает что все что передал сервер сразу придет к тебе.. имеет смысл перед посылкой данных отсылать их длину - чтоб клиент "взял" из потока данных стока скока пологается.. как это сделать - поиши по форуму по словам TotalDataSize и DataBlock - Digitman кому то уже все дословно разжевывал (даже кусок рабочего кода дал).
Polevi (2002-12-10 09:22:00) [15]информация не пропадет
ReceiveBuf возвращает колво байт, помещенных в твой буфер
если ты ожидаешь больше данных - вызови эту ф-ию снова