Подскажите можно ли узнать полный объем ПОСТУПАЮЩИХ, а не поступивших данных с удаленной машины. Передается ли такая информация (по логике должна: иначе как по другому останавливать сбор пакетов)?
А сам подумай ? Если ты имеешь ввиду объем данных за 1 сессию, то можно. Если же ты хочешь за весь сеанс связи узнать заранее объем данных, до разъединения, то ничего не получится. Если не то - сформулируй вопрос правильно. Я лично не особо тебя понял, что ты хочешь. И еще определись, какой именно протокол тебя интересует. Если UDP, то мой ответ не верен. Там ты точно можешь узнать - так как там не поток данных , а дейтаграмма.
1) меня интересуют оба протокола 2) объем данных, переданных одним вызовом send (при условии, что все данные были переданы). Т.е. можно ли при получении первых байт уже знать, сколько всего было передано. Читал раньше что-то про сигнал PUSH в протоколе TCP, может с ним как? Совсем подробно: 1) первый отправил данные Код (Text): send(socket, buff, FULL_BUFF_SIZE, 0) 2) второй дождался начала поступления данных вызовом Код (Text): ioctlsocket(socket, FIONREAD, mayread) . Как второму получить значение Код (Text): FULL_BUFF_SIZE ? Конечно, можно последовательно ждать приход всех пакетов и клеить из них. Но хотелось бы все-таки получить это значение!
send помещает данные во внутренний буфер сокета (размер этого буфера можно менять) Если через некоторое время ничего в этот буфер не поступит, то данные отправятся. Если поступят, то данные пойдут в общем пакете (при условии, что они не привысят размер данных в TCP, если привысят, то в первом пакете уйдут не все данные). По умолчанию MTU=1500. Если такой пакет будет проходить через маршрутизатор с MTU=1000, то маршрутизатор ""разрежет" этот пакет на два. В худшем случае второй пакет может задержаться и в буфер сокета на приемной стороне поступит только первый пакет. Значит recv снимет не все данные. Э. Джонс, Д. Оланд: "ioctlsocket(socket, FIONREAD, mayread) не всегда гарантирует выдачу точного результата. Для UDP возвращает размер первого сообщения" Оно и понятно. Пока ты вызывал ioctlsocket в буфер могли поступить данные.
SnugForce> 1) После вызова send, снова он будет вызываться только после полной отправки и получения ответа (тоже полностью). 2) ioctlsocket я использую только для того, чтобы определить, что что-то начало поступать. Затем в цикле пользуюсь recv. Заранее общий размер данных я не знаю, а хотелось бы (есть некоторые скользкие моменты, которые могут быть подвержены атакам на переполнение буфера).
Xerx Ну так при вызове recv указывается размер буфера. А переполнение это уже когда ты делаешь манипуляции с буфером. А зачем определять что данные в буфере сокета есть? Ты кстати какую модель ввода-вывода используешь?
SnugForce> У меня асинхронная передача с ожиданием по select. А определение нужно из-за работы алгоритма (в начале N секунд ожидается начало поступления данных). PE386> Так бы сразу. Нет так нет.