Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两个Socket.BeginReceive调用之间的TCP数据包会发生什么情况?_C#_Sockets_Tcp_Packets_Beginreceive - Fatal编程技术网

C# 两个Socket.BeginReceive调用之间的TCP数据包会发生什么情况?

C# 两个Socket.BeginReceive调用之间的TCP数据包会发生什么情况?,c#,sockets,tcp,packets,beginreceive,C#,Sockets,Tcp,Packets,Beginreceive,我对套接字编程有疑问。我正在开发一个TCP包嗅探器。我正在使用Socket.beginacept、Socket.BeginReceive捕获每个数据包,但当收到数据包时,我必须处理一些事情。这是一个快速操作,但需要几毫秒,然后再次调用BeginReceive 我的问题是,如果在我处理时发送了一些数据包,但没有调用BeginReceive,会发生什么?数据包是否丢失,或者是否在内部缓冲?有限制吗?它们是缓冲的,但我不知道在什么级别或限制是什么 是一个很好的资源,您可能会发现它对任何与winsock

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


我的问题是,如果在我处理时发送了一些数据包,但没有调用BeginReceive,会发生什么?数据包是否丢失,或者是否在内部缓冲?有限制吗?

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


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

在linux世界中,内核会为您缓冲它们-我假设windows世界也会这样做。但最终正如deltreme所说,缓冲区将溢出(这肯定是有限制的),数据有可能会被无声地丢弃


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

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

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