如何确定套接字发送缓冲区中有多少数据

4

我可以通过调用Socket.IOControl(IOControlCode.DataToRead, null, outValue);来确定套接字接收缓冲区中有多少数据。

那么有没有相应的方式可以确定套接字发送缓冲区中有多少数据呢?

我需要在带宽和延迟受限的网络上尽可能多地发送UDP数据包,但遇到了发送缓冲区溢出的情况,因此我需要实现一些形式的节流。

2个回答

3
UDP套接字没有发送缓冲区。在UDP中,SO_SNDBUF套接字选项的含义是你可以发送数据报的大小限制。内核通常会为每个NIC分别设置一个数据包队列,但这适用于所有协议,并且没有用户空间API来查询其大小。IP层以及硬件可能会默默地丢弃数据包。TCP知道如何处理,UDP不知道。因此,除非.Net或其他Microsoft奇迹在用户空间库中具有这样的缓冲,否则你将没有运气。
解决方法是让接收者向发送者发出有关已丢弃数据包的信号,请求重新发送,退回到TCP等等。这也意味着需要从发送者那里获得某种排序。
希望这可以帮到您。

1
看起来答案就是这个 - 不要发送数据包太快了 :-) - tomfanning

0
你能分析一下头部吗?可能会有关于内容长度的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接