UDP套接字。如何确定数据是否发送到电线?

时间:2012-05-18 09:05:03

标签: c++ sockets udp

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

所以我需要一种方法来确定数据是否在 Sendto()之后发送到网络,以找出客户端实际发送的时间。它存在吗?

操作系统:Windows 7

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

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

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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

  

我需要一种方法来确定数据是否在Sendto()之后发送到连线,以找出客户端实际发送的时间。它存在吗?

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

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

答案 2 :(得分:0)

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

原来的问题是ARP从未从本地链接主机获得响应,因此该数据包在内部被丢弃。

简单的答案是;如果可以对目标地址执行PING操作,则几乎可以肯定您的UDP数据包将发送到网上。如果PING说“主机无法访问”,则不会。如果您只是用tcpdump或Wireshark嗅探UDP数据包,您可能会以为您的设备有问题,因为您的UDP数据包从未发送过!

也可以嗅探ARP响应,或者甚至可以以编程方式检查ARP缓存中是否有目标地址(如果是本地)或网关(如果不是)的条目。