2013-05-30 44 views
1

在我的C#应用​​程序中,我通过调用Socket.SendTo来发送UDP消息,每秒可能高达10,000次。我知道它有时无法跟上我发送的数量。有没有办法检查它已经排队或积压发送的数据量(以字节为单位,或者我称为SendTo等的次数)?如何查看C#套接字排队发送的字节数?

我的理想解决方案是丢弃非必要的消息,如果套接字开始在后面运行并让基本消息被套接字排队,那么在我调用SendTo之前知道套接字状态会非常有帮助。

感谢

回答

0

的数据包可以在很多不同的地方排队,这不是真的可行做到这一点:他们可能是在插座上,在IP栈的某个地方,在网络接口输出队列,等等。

即使您找到了一种方法来查询操作系统中的适当队列(这肯定不会是可移植的),但这样做并不能真正解决您的问题。原因在于,除非实际上发送消息的速度超过了网络接口可以处理的速度,否则最有可能发生在发送计算机之外的网络某处。由于现在通用计算机上的许多网络接口都是1Gbps,因此网络接口很可能能够在发送数据包的速度与发起数据包时一样快。阻塞点可能是一个以太网交换机或某处的路由器,当那个以太网交换机或路由器正在丢弃数据包或不在时,您将无法查询队列。

0

您想要做的问题是,它是管理传出队列的操作系统内核,而不是您的应用程序。而且随着UDP更少的排队正在进行,所以如果需要的话,数据包就会被丢弃。

最好的办法是在命令行上看到netstat -s来查看协议统计信息和数据包丢弃计数(Windows可能有一些花哨的API来查询应用程序中的相同内容,但我不知道它)。

找到您的主机和网络可以承受的可接受消息速率,并在达到/超过时切换到“精益”输出。这需要一些簿记,但可以很容易地用时间戳的环形缓冲区来完成。

相关问题