1

我正在使用UDP套接字。服务器应用程序向客户端发送有关客户端应将数据传输到服务器多长时间的信息。然后,客户端在这段时间内通过发送特定的数据包开始传输。

所以我需要一种方法来确定数据是否在Sendto()之后发送到线路,以了解客户端实际发送了多少时间。它存在吗?

操作系统:Windows 7

我尝试使用性能计数器(网络接口 \ 输出队列长度),但它始终为 0;

我知道的另一种方法是将 SO_SNDBUF ( setsockopt() ) 设置为要发送的数据包的大小。因此sendto()会阻塞,直到发送套接字缓冲区已满(前一个数据包未发送到网络接口缓冲区)。但似乎它不起作用,只是因为它只适用于套接字缓冲区而不是网络接口缓冲区。

我也对 Linux 的解决方案感兴趣。

4

3 回答 3

1

我遇到了一个类似的问题,即使 send() 没有返回错误,UDP send() 也从未真正连接到网络上。

原来问题是 ARP 从来没有得到本地链路主机的响应,所以数据包在内部被丢弃了。

简单的答案是;如果您可以 PING 目标地址,您的 UDP 数据包几乎肯定会进入网络。如果 PING 显示“主机无法访问”,则不会。如果您只是用 tcpdump 或 wireshark 嗅探 UDP 数据包,您可能会认为您的设备有问题,因为,嘿,您的 UDP 数据包从未发送过!

因此,还可以嗅探 ARP 响应,或者您甚至可以通过编程方式检查 ARP 缓存以查找目标地址(如果是本地)或网关(如果不是)的条目。

于 2018-10-27T15:07:57.530 回答
0

阅读上面 Mat 的评论。通常使用 UDP,您必须假设数据在您调用 send() 方法后立即发送。无法确定数据是否实际发送和/或接收。

编辑:我的意思是没有办法确定数据已到达预期目的地。您可以检查数据是否正在发送,甚至可以在一定程度上跟踪它的路线。但是没有办法确保数据已收到,即使您的预期收件人可以访问,这并不意味着他们正在收听......

于 2012-05-18T09:19:21.680 回答
0

我需要一种方法来确定在 Sendto() 之后是否将数据发送到线路,以了解客户端实际发送了多少时间。它存在吗?

至于sendto()成功传输的数据包是否发送到客户端,这可能比您需要做的工作更多。

为确保客户端仅在特定时间段内发送,您需要在服务器的数据包中包含剩余的传输时间。客户端还应该估计通过网络到达服务器所需的时间。使用这两个数字来估计客户端传输的剩余时间。

于 2012-05-18T09:20:23.853 回答