【发布时间】:2012-01-13 01:30:54
【问题描述】:
我感兴趣的基本代码序列是(伪代码)
sendto(some host); // host may be unreachable for now which is normal
...
if(select(readfs, timeout)) // there are some data to read
recvfrom();
自 Win2000 起,ICMP 数据包在将 UDP 数据报发送到无法访问的端口后返回,触发选择,之后 recvfrom 失败并显示 WSAECONNRESET。这种行为对我来说是不可取的,因为在这种情况下我希望 select 以超时结束(没有要读取的数据)。在 Windows 上,这可以通过 WSAIoctl SIO_UDP_CONNRESET (http://support.microsoft.com/kb/263823) 解决。
我的问题是:
- 在这种情况下,SIO_UDP_CONNRESET 是不是最好的方法?
- 是否有其他方法可以忽略“选择”的 ICMP 或过滤它以用于 recvfrom(也许,忽略 Windows 上的 WSAECONNRESET 错误,将其视为超时,是否可以在其他情况下触发此错误)?
- 在 Linux 和 Unix(Solaris、OpenBSD)上是否存在类似问题?
【问题讨论】:
-
您是否只使用一次连接?如果没有,如果您从未收到错误消息告诉您连接不再处于活动状态并且应该关闭,您如何知道何时关闭连接?
-
我想继续发送数据报,直到远程主机(实际上是一些嵌入式系统)启动或用户终止此操作。
-
从 Linux 移植应用程序时遇到此错误。在我的情况下,它是 UDP 数据报的非阻塞广播,我根本不想关闭连接,如果客户端死了,我开始在服务器上的 recv 上收到 WSAECONNRESET 错误!似乎错误并不清楚。由 SIO_UDP_CONNRESET 修复,但在我看来就像 Winsock 中的一个错误。
标签: c sockets udp winsock icmp