Форум: "Сети";
Текущий архив: 2003.02.03;
Скачать: [xml.tar.bz2];
ВнизУважаемые мастера, подскажите, пожалуйста... Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.064 c