我对套接字编程有疑问。我正在开发一个TCP数据包嗅探器。我使用Socket.BeginAccept,Socket.BeginReceive来捕获每个数据包,但是当收到数据包时我必须处理一些事情。这是一个快速操作,但需要几毫秒,然后再次调用BeginReceive。
我的问题是,如果在处理过程中发送了一些数据包会发生什么,并且没有调用BeginReceive?数据包丢失,还是内部缓冲?有限制吗?
答案 0 :(得分:2)
在linux世界中,内核会为你缓冲它们 - 我假设windows世界做同样的事情。但最终正如deltreme所说,缓冲区将溢出(肯定存在限制),并且数据可能会被静默删除。
如果你正在做重量级的事情,每个数据包只有几毫秒,那么你可能要考虑使用线程池来释放网络线程。即您的所有网络线程都应该抓取数据包并将其丢弃到队列中以供另一个线程处理,然后返回到网络侦听。另一个线程/线程可以从队列中获取这些数据包并处理它们 - 好的是你甚至可以一次处理多个数据包,从而节省一些开销。在这里,您的队列将充当缓冲区,您可以控制它的大小,并且您可以定义自己的丢弃策略。
答案 1 :(得分:1)
它们是缓冲的,但我不知道在什么级别或限制是什么。
http://tangentsoft.net/wskfaq/是一个很好的资源,您可能会发现任何与winsock相关的问题都很有用。
答案 2 :(得分:1)
TCP为您提供可靠的流,因此数据不会丢失(假设底层网络没有失败)。
两端的操作系统都有缓冲区,可以在您不读取字节时处理这些字节。这些缓冲区的大小有限,如果它们填满,TCP就会有流量控制 - 基本上发送端会发现缓冲区已满并停止发送,直到有更多空间可用。