c++ - UDP 套接字。如何确定数据是否发送到线路?

标签 c++ sockets udp

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

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

操作系统:Windows 7

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

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

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

最佳答案

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

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

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

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

关于c++ - UDP 套接字。如何确定数据是否发送到线路?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10649717/

相关文章:

c++ - 在 C++ 中测量 APDU 命令到 Java Card 的时间的最佳方法

C++ 演练问题 :

c++ - 如何将 .pdf 的文章摘要放入我的 C++ 程序中

sockets - 如何修复 mediawiki 中的 'Redis server error: socket error on read socket' 错误

c - 在c中使用udp进行可靠的数据传输

c++ - 为 Raspberry pi 2 预编译 amazon-kinesis-video-streams-producer-sdk-cpp

java - 使用 Spring 框架在 java 中配置 TCP/IP

debugging - 跟踪程序的 TCP/UDP 连接

linux - UDP 的 Nginx 直接服务器返回

java - 为什么 Android 在套接字末尾发送奇怪的符号? (�)