2010-04-08 55 views
3

我对套接字编程有疑问。我正在开发一个TCP数据包嗅探器。我使用Socket.BeginAccept,Socket.BeginReceive捕获每个数据包,但是当收到数据包时,我必须处理一些内容。这是一个快速操作,但需要几毫秒,然后再次调用BeginReceive。两个Socket.BeginReceive调用之间的TCP数据包会发生什么?

我的问题是,如果某些数据包在我正在处理时发送,并且没有调用BeginReceive会发生什么?数据包丢失,还是内部缓冲?有限制吗?

回答

1

他们被缓冲,但我不知道什么水平或限制是什么。

http://tangentsoft.net/wskfaq/是一个很好的资源,你可能会发现有用的任何winsock相关的问题。

2

在Linux世界中,内核会为你缓冲它们 - 我假设Windows世界也做同样的事情。但最终如deltera所言,缓冲区会溢出(这绝对是一个限制),并且数据有可能被无声地丢弃。

如果你正在做重量级的事情,每个数据包只有几毫秒,那么你可能要考虑使用线程池来释放网络线程。即你所有的网络线程应该做的就是抓住数据包并将它放到一个队列中供其他线程处理,然后返回到网络上监听。另一个线程/线程可以将这些数据包从队列中取出并处理它们 - 好处是,您甚至可以一次处理多个数据包,从而节省一些开销。在这里,你的队列将充当缓冲区,你可以控制你想要的大小,你可以定义你自己的丢弃策略。

1

TCP为您提供可靠的流,因此数据不会丢失(假设底层网络不会失败)。

两端的操作系统具有缓冲区,当您不在读取它们时,会处理这些字节。那些缓冲区的大小是有限的,如果它们满了,TCP就有流量控制 - 实质上,发送端会发现缓冲区已满并停止发送,直到有更多空间可用。

相关问题