2010-04-08 1 views
3

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

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

ответ

1

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

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

2

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

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

1

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

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