Что происходит с TCP-пакетами между двумя вызовами Socket.BeginReceive? - PullRequest
3 голосов
/ 08 апреля 2010

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

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

Ответы [ 3 ]

2 голосов
/ 09 апреля 2010

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

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

1 голос
/ 30 октября 2010

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

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

1 голос
/ 08 апреля 2010

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

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

...