【发布时间】:2012-05-25 20:32:45
【问题描述】:
我正在使用 UDP 套接字。服务器应用程序向客户端发送有关客户端应将数据传输到服务器多长时间的信息。然后,客户端在这段时间内通过发送特定的数据包开始传输。
所以我需要一种方法来确定数据是否在 Sendto() 之后发送到线路,以了解客户端实际发送了多少时间。存在吗?
操作系统:Windows 7
我尝试使用性能计数器(网络接口\输出队列长度)但它始终为0;
我知道的另一种方法是将 SO_SNDBUF ( setsockopt() ) 设置为要发送的数据包的大小。所以 sendto() 阻塞,直到发送套接字缓冲区已满(前一个数据包未发送到网络接口缓冲区)。但似乎它不起作用,只是因为它只适用于套接字缓冲区而不是网络接口缓冲区。
我也对 Linux 的解决方案感兴趣。
【问题讨论】:
-
UDP 不可靠(按设计)。我不确定您到底要做什么,但这是您无法解决的问题。如果您需要知道某物是否收到了消息,请使用 TCP 或其他一些可靠的协议。
-
感谢您的评论。我不需要知道某事是否收到了消息。问题是什么时候发送它。我的意思是发送到线路,而不是放入套接字缓冲区或网络接口缓冲区。我只需要知道客户端发送数据的时间。
-
该信息没有什么价值,因为您甚至无法保证是否会发送,如果是,则绝对不能保证会收到数据包。
-
“这些信息没有什么价值,因为你甚至不能保证是否会被发送”。 UDP 不保证发送?
-
没有。成功的
sendto告诉您操作系统将您的数据包放入缓冲区。就这样。如果它与该内存有更好的关系,操作系统可以在此之后立即丢弃它。