Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.03;
Скачать: CL | DM;

Вниз

Уважаемые мастера, подскажите, пожалуйста...   Найти похожие ветки 

 
Nord-Ost ©   (2002-12-10 09:18) [0]

Если я принимаю данные с помощью команды ReceiveBuf(buf,count), то как выбрать размер буфера, чтобы полностью принять весь пакет информации, переданный сервером? А если не хватит буфера, то не пропадет ли информация и смогу ли я принять оставшуюся часть в следующем пакете? Спасибо.


 
Polevi ©   (2002-12-10 09:22) [1]

информация не пропадет
ReceiveBuf возвращает колво байт, помещенных в твой буфер
если ты ожидаешь больше данных - вызови эту ф-ию снова


 
savva ©   (2002-12-10 09:24) [2]

а он может весь срузу и не прийти:) чтобы узнать скока тебе надо получать есть функция ReceiveLen, которая и возвращает длину буффера на входе.. но это не означает что все что передал сервер сразу придет к тебе.. имеет смысл перед посылкой данных отсылать их длину - чтоб клиент "взял" из потока данных стока скока пологается.. как это сделать - поиши по форуму по словам TotalDataSize и DataBlock - Digitman кому то уже все дословно разжевывал (даже кусок рабочего кода дал).


 
Nord-Ost ©   (2002-12-10 09:25) [3]

А как сервер узнает, откуда начинать продолжение передачи?


 
Anatoly Podgoretsky ©   (2002-12-10 09:28) [4]

Зачем тебе об этом беспокоиться, это забота сервера, твое дело принимать


 
Nord-Ost ©   (2002-12-10 09:30) [5]


> savva

А сервер не мой, посему я не могу приказать ему передавать длину :-(


 
Nord-Ost ©   (2002-12-10 09:32) [6]


> Anatoly Podgoretsky

Вы имете в виду, что при следующем вызове ReceivebBuf я приму следующую порцию, продолжение предыдущей передачи?


 
Nord-Ost ©   (2002-12-10 09:47) [7]

Кажись, понял:
ReceiveBuf(buf,Socket.ReceiveLength)
Это правильно?


 
savva ©   (2002-12-10 10:05) [8]

в принципе правильно.. но лучще (для меня) сделать так
len:=Socket.ReceiveLength;
recLen:=ReceiveBuf(buf,len);

а дальше сравнивать len и recLen..


 
savva ©   (2002-12-10 10:07) [9]

> Nord-Ost © (10.12.02 09:30)
> А сервер не мой, посему я не могу приказать ему передавать
> длину :-(
а признак границы данных какой либо есть?


 
Nord-Ost ©   (2002-12-10 10:13) [10]


> savva

Нет, нету (смотрел сниффером)


 
savva ©   (2002-12-10 10:35) [11]

а как же ты собрался считать? ну прочитал ты данные в буфер - что дальше? они что имеют фиксированную длину? если да - то как определить начало?


 
Nord-Ost ©   (2002-12-10 10:44) [12]

Нет, фиксированной длины они не имеют. А длина определяется из TCP-пакета, она ведь присутствует в заголовке.


 
Nord-Ost ©   (2002-12-10 10:46) [13]

Хе-хе, сам же и ответил :-)


 
Digitman ©   (2002-12-10 11:04) [14]


> А сервер не мой, посему я не могу приказать ему передавать
> длину


Если неизвестен протокол инф.обмена, лучше даже не берись за это дело. Ничего путного не получится.

Но если, например, известно, что сервер В ДАН. МОМЕНТ передает строку, ограниченную терминатором и не имеющую префикса размера, что мешает получить ее ? Буферизуй прием (читая в каждом событии OnRead() данные с пом. ReceiveBuf() во врем.буфер размером не более 4к), анализируй наличие в буфере символа-терминатора строки и добавляй символы слева от терминатора (если он обнаружен, либо - все содержимое врем.буфера) в основной буфер, накапливая таким образом данные, последовательно принятые в нескольких событиях OnRead()


 
Nord-Ost ©   (2002-12-10 11:08) [15]


> Digitman

Угу, понял, спасибо огромное.



Страницы: 1 вся ветка

Текущий архив: 2003.02.03;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
9-4693
FreeMen
2002-08-08 15:49
2003.02.03
Как найти кратчайший путь?


1-4910
Mikrom
2003-01-25 14:11
2003.02.03
Можно ли поменять внешний вид формы


1-5053
Separator
2003-01-17 10:45
2003.02.03
Состояние нажатия и отжатия у TUpDown


3-4778
CPPBuilderDev
2003-01-16 19:24
2003.02.03
ПОМОГИТЕ, извелся весь (модератору плииз не пинать)!


1-5044
Azim
2003-01-24 10:35
2003.02.03
DBGrid