Что происходит с TCP-пакетами между двумя вызовами Socket.BeginReceive?

У меня есть сомнения по поводу программирования сокетов. Я разрабатываю анализатор пакетов TCP. Я использую Socket.BeginAccept, Socket.BeginReceive для захвата каждого пакета, но когда пакет получен, мне нужно что-то обработать. Это быстрая операция, но она займет несколько миллисекунд, а затем снова вызовет BeginReceive.

Мой вопрос: что произойдет, если некоторые пакеты будут отправлены во время обработки и не вызваны BeginReceive? Пакеты теряются или буферизуются внутри? Есть ли предел?


person Rodrigo    schedule 08.04.2010    source источник


Ответы (3)


В мире Linux ядро ​​будет буферизовать их для вас — я предполагаю, что мир Windows делает то же самое. Но в конце концов, как сказал deltreme, буфер переполнится (определенно есть предел), и есть вероятность, что данные будут удалены без вывода сообщений.

Если вы делаете что-то настолько тяжелое, как несколько миллисекунд на пакет, вы можете рассмотреть возможность использования пула потоков, чтобы освободить сетевой поток. т.е. все, что должен сделать ваш сетевой поток, — это захватить пакет и поместить его в очередь для обработки другим потоком и вернуться к прослушиванию в сети. Другой поток/потоки могут захватить эти пакеты из очереди и обработать их — приятно, что вы даже можете обрабатывать несколько пакетов одновременно, что сэкономит некоторые накладные расходы. Здесь ваша очередь будет действовать как буфер, и вы можете контролировать, насколько большой вы хотите, чтобы она была, и вы можете определить свою собственную политику удаления.

person Clive Saha    schedule 09.04.2010

Они буферизуются, но я не знаю, на каком уровне и каков предел.

http://tangentsoft.net/wskfaq/ — отличный ресурс, который может оказаться полезным для решения любых проблем, связанных с winsock. .

person C.Evenhuis    schedule 08.04.2010

TCP обеспечивает надежный поток, поэтому данные не теряются (при условии, что базовая сеть не выходит из строя).

ОС на обоих концах имеет буферы, которые заботятся о байтах, когда вы их не читаете. Эти буферы имеют конечный размер, если они заполняются, TCP имеет управление потоком - по сути, отправляющая сторона обнаружит, что буферы заполнены, и прекратит отправку до тех пор, пока не станет доступным больше места.

person nos    schedule 30.10.2010