Объем поступающих данных

Тема в разделе "WASM.NETWORKS", создана пользователем Xerx, 9 окт 2006.

  1. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Подскажите можно ли узнать полный объем ПОСТУПАЮЩИХ, а не поступивших данных с удаленной машины. Передается ли такая информация (по логике должна: иначе как по другому останавливать сбор пакетов)?
     
  2. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Xerx
    Ты про что сейчас? TCP или на прикладном уровне(т.е. свой протокол)?
     
  3. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Хм, да, совсем забыл. Извиняюсь. TCP, UDP.
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    А сам подумай ? Если ты имеешь ввиду объем данных за 1 сессию, то можно. Если же ты хочешь за весь сеанс связи узнать заранее объем данных, до разъединения, то ничего не получится.
    Если не то - сформулируй вопрос правильно. Я лично не особо тебя понял, что ты хочешь. И еще определись, какой именно протокол тебя интересует. Если UDP, то мой ответ не верен. Там ты точно можешь узнать - так как там не поток данных , а дейтаграмма.
     
  5. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    1) меня интересуют оба протокола
    2) объем данных, переданных одним вызовом send (при условии, что все данные были переданы). Т.е. можно ли при получении первых байт уже знать, сколько всего было передано. Читал раньше что-то про сигнал PUSH в протоколе TCP, может с ним как?

    Совсем подробно:
    1) первый отправил данные
    Код (Text):
    1. send(socket, buff, FULL_BUFF_SIZE, 0)
    2) второй дождался начала поступления данных вызовом
    Код (Text):
    1. ioctlsocket(socket, FIONREAD, mayread)
    .
    Как второму получить значение
    Код (Text):
    1. FULL_BUFF_SIZE
    ? Конечно, можно последовательно ждать приход всех пакетов и клеить из них. Но хотелось бы все-таки получить это значение!
     
  6. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    send помещает данные во внутренний буфер сокета (размер этого буфера можно менять) Если через некоторое время ничего в этот буфер не поступит, то данные отправятся. Если поступят, то данные пойдут в общем пакете (при условии, что они не привысят размер данных в TCP, если привысят, то в первом пакете уйдут не все данные).
    По умолчанию MTU=1500. Если такой пакет будет проходить через маршрутизатор с MTU=1000, то маршрутизатор ""разрежет" этот пакет на два. В худшем случае второй пакет может задержаться и в буфер сокета на приемной стороне поступит только первый пакет. Значит recv снимет не все данные.
    Э. Джонс, Д. Оланд:
    "ioctlsocket(socket, FIONREAD, mayread) не всегда гарантирует выдачу точного результата. Для UDP возвращает размер первого сообщения"
    Оно и понятно. Пока ты вызывал ioctlsocket в буфер могли поступить данные.
     
  7. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    SnugForce>
    1) После вызова send, снова он будет вызываться только после полной отправки и получения ответа (тоже полностью).
    2) ioctlsocket я использую только для того, чтобы определить, что что-то начало поступать. Затем в цикле пользуюсь recv. Заранее общий размер данных я не знаю, а хотелось бы (есть некоторые скользкие моменты, которые могут быть подвержены атакам на переполнение буфера).
     
  8. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Xerx
    Ну так при вызове recv указывается размер буфера. А переполнение это уже когда ты делаешь манипуляции с буфером.
    А зачем определять что данные в буфере сокета есть? Ты кстати какую модель ввода-вывода используешь?
     
  9. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    Для tcp никак. Для udp число байт возвращаемое recv всегда равно размеру датаграммы.
     
  10. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    SnugForce> У меня асинхронная передача с ожиданием по select.
    А определение нужно из-за работы алгоритма (в начале N секунд ожидается начало поступления данных).

    PE386> Так бы сразу. Нет так нет.