在我的C#应用程序中,我通过调用Socket.SendTo
每秒最多发送10,000次来发送UDP消息。我知道有时无法跟上我发送的数量。有没有办法检查排队或积压发送多少数据(以字节为单位,或我称之为SendTo
的次数等)?
我理想的解决方案是在套接字开始运行后删除非必要消息,并让基本消息排在套接字之前,因此在调用SendTo
之前了解套接字状态会非常有帮助。
由于
答案 0 :(得分:0)
数据包可能在很多不同的地方排队,这样做是不可行的:它们可能位于套接字,某个IP堆栈,网络接口输出队列等中......
即使您找到了一种方法来查询操作系统中的相应队列(肯定不可移植),您也无法通过这样做来解决问题。原因是,除非您实际发送的消息比网络接口可以处理的速度快,否则瓶颈很可能出现在网络上的某个地方,在发送计算机之外。由于目前通用计算机上的许多网络接口都是1Gbps,因此网络接口很可能能够以您发起数据包的速度发送数据包。阻塞点可能是某个以太网交换机或路由器,当以太网交换机或路由器正在丢弃数据包时,以及当它不丢弃时,您将无法通过查询队列找到它。
答案 1 :(得分:0)
您要做的事情的问题在于管理传出队列的是操作系统内核,而不是您的应用程序。使用UDP甚至更少排队,所以如果需要,数据包就会被丢弃。
您最好在命令行上netstat -s
查看协议统计信息和数据包丢弃计数(Windows可能有一些奇特的API可以从应用程序中查询相同内容,但我不知道它。)< / p>
找到主机和网络可以维持的可接受的消息速率,并在达到/超过时切换到“精简”输出。这需要一些簿记,但可以使用时间戳的环缓冲区轻松完成。