3

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

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

4

3 回答 3

2

在 linux 世界中,内核会为你缓冲它们——我假设 windows 世界做同样的事情。但最终正如 deltreme 所说,缓冲区会溢出(肯定有一个限制),并且有可能数据会被静默丢弃。

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

于 2010-04-09T15:20:19.863 回答
1

它们是缓冲的,但我不知道在什么级别或限制是什么。

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

于 2010-04-08T07:58:54.763 回答
1

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

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

于 2010-10-30T00:54:17.480 回答