2015-10-19 111 views
1

我的应用程序持续向不同的主机发送UDP数据包。当主机处于活动状态时,UDP数据包到达主机,并且函数返回发送给它的字节数。但是,当主机关闭时(电缆拔下或复位),sendto函数不发送UDP数据包,但仍返回缓冲区中的字节数。不发送UDP数据包,而是发送ARP数据包以查找主机。为什么sendto函数不返回SOCKET_ERROR? WSAGetLastError函数也返回0。我怎么能注意到发送UDP数据包到不可访问主机的错误?UDP sendto永远不会失败

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

+0

您尝试过哪些失败案例?只需拔掉电缆? – lsbbo

+0

发现错误时,返回任何内容都太迟了。 –

回答

7

问题的标题 - “UDP sendto永不失败” - 是UDP的一个很好的单行摘要。

这就是UDP的工作原理 - UDP不关心目标是否可达。
UDP sendto数据包离开您的应用程序时“成功”;就UDP而言,甚至不需要离开计算机。

ARP软件包是您的计算机尝试找到到达主机的方式,但此时sendto已经“成功”。

如果你想要一个可靠的协议,UDP不是你正在寻找的。

+0

你是对的,但有没有什么办法可以发现我的数据包没有离开计算机,我的操作系统正在通过发送ARP数据包来寻找主机? –

+0

@MustafaChelik我怀疑是否存在,但可能会有某些特定于Windows的东西可以用来代替套接字。使用适合你的目的的协议,或者在UDP之上实现一个协议,可能是一个更好的主意。 – molbdnilo

0

一个UDP sendto()除非您发送了一个连接的UDP套接字,在这种情况下,您可以随后发送得到一个错误不可能返回性质的错误。