我的应用程序不断向不同的主机发送UDP数据包。当主机处于活动状态时,UDP数据包到达主机,sendto
函数返回发送给它的字节数。但是当主机出现故障(电缆拔出或重置)时,sendto
函数不会发送UDP数据包,但仍会返回缓冲区中的字节数。不会发送UDP数据包,而是发送ARP数据包以查找主机。为什么sendto
函数不返回SOCKET_ERROR? WSAGetLastError
函数也返回0。如何将UDP数据包发送到无法访问的主机时发现错误?
P.S。我的操作系统是Winodws 7 x64,我的应用程序是原生C ++和64位。
答案 0 :(得分:7)
你的问题的标题 - “UDP sendto永远不会失败” - 是一个非常好的UDP一行摘要。
这就是UDP的工作方式 - UDP并不关心目的地是否可以到达
当数据包离开您的应用程序时,UDP sendto
“成功”;就UDP而言,它甚至不需要离开您的计算机。
ARP套餐是您的计算机试图找到到达主机的方法,但此时sendto
已经“成功”。
如果你想要一个可靠的协议,UDP就不是你想要的了。
答案 1 :(得分:0)
除非您通过连接的UDP套接字发送,否则UDP sendto()
不可能返回该性质的错误,在这种情况下,可能在后续发送时出错。