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

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

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

3 ответа

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

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

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

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

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

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

Другие вопросы по тегам