使用UDP

时间:2016-02-17 21:53:39

标签: c linux udp handle polling

我一直在写(用全能的C)一个用UDP监听的服务器。我有2个套接字监听同一个端口(IPv4和IPv6),我使用poll()来监控这两个套接字。

那么,在收听时,处理民意调查的正确方法是什么?有可能收到POLLHUP吗?如果可能的话必须如何处理? POLLERR也是如此

另外,它可以接收POLLRDBAND或POLLPRI吗?如果是,那么它意味着什么以及必须如何处理?

提前致谢。

PS:所有问题都与UDP相关

2 个答案:

答案 0 :(得分:1)

POLLHUP表示套接字已断开连接。因为您的程序正在侦听UDP套接字,所以不应该出现此错误情况。

然而,您可能会获得POLLERR,并且应该准备好处理它。 POSIX.1-2008 standard

POLLERR
An error has occurred on the device or stream. This flag is only valid in
the revents bitmask; it shall be ignored in the events member.

并且错误可能是由硬件故障引起的。您应该销毁套接字并尝试重新创建它。

与TCP不同,UDP没有将数据包标记为紧急或带外的机制,因此您不应该获得POLLRDBAND或POLLPRI。此外,这两个条件都是可选的过时扩展 - 因此不应根据POSIX.1-2008标准使用它们:

Obsolescent
The functionality described may be removed in a future version of this 
volume of POSIX.1-2008. Strictly Conforming POSIX Applications and Strictly 
Conforming XSI Applications shall not use obsolescent features.

XSI STREAMS
The functionality described is optional. The functionality described is also 
an extension to the ISO C standard.

答案 1 :(得分:0)

如果您发送数据包并且任何 ICMP 错误都引用该数据包(网络无法访问、主机无法访问、端口无法访问......),则 POLLERR 可能发生在 SOCK_DGRAM 上。
由于返回是异步的,因此写入本身会成功。