UDP sendto永远不会失败

时间:2015-10-19 06:50:51

标签: c++ sockets winapi network-programming

我的应用程序不断向不同的主机发送UDP数据包。当主机处于活动状态时,UDP数据包到达主机,sendto函数返回发送给它的字节数。但是当主机出现故障(电缆拔出或重置)时,sendto函数不会发送UDP数据包,但仍会返回缓冲区中的字节数。不会发送UDP数据包,而是发送ARP数据包以查找主机。为什么sendto函数不返回SOCKET_ERROR? WSAGetLastError函数也返回0。如何将UDP数据包发送到无法访问的主机时发现错误?

P.S。我的操作系统是Winodws 7 x64,我的应用程序是原生C ++和64位。

2 个答案:

答案 0 :(得分:7)

你的问题的标题 - “UDP sendto永远不会失败” - 是一个非常好的UDP一行摘要。

这就是UDP的工作方式 - UDP并不关心目的地是否可以到达 当数据包离开您的应用程序时,UDP sendto“成功”;就UDP而言,它甚至不需要离开您的计算机。

ARP套餐是您的计算机试图找到到达主机的方法,但此时sendto已经“成功”。

如果你想要一个可靠的协议,UDP就不是你想要的了。

答案 1 :(得分:0)

除非您通过连接的UDP套接字发送,否则UDP sendto()不可能返回该性质的错误,在这种情况下,可能在后续发送时出错。