Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Уважаемые мастера, подскажите, пожалуйста... [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 возвращает колво байт, помещенных в твой буфер
если ты ожидаешь больше данных - вызови эту ф-ию снова


Наверх

Титульная страница Поиск, карта сайта Написать письмо