使用 UDP 处理 POLL
POLL handling with UDP
我一直在编写(使用全能的 C)一个在 UDP 中侦听的服务器。我有 2 个套接字在同一个端口(IPv4 和 IPv6)上侦听,我正在使用 poll() 来监视两个套接字。
那么,在收听时,处理轮询报告错误的正确方法是什么?是否可能收到 POLLHUP?如果可能,必须如何处理? POLLERR
也一样
此外,是否可以接收 POLLRDBAND 或 POLLPRI?如果是,那么它意味着什么以及必须如何处理?
提前致谢。
PS:所有问题都与UDP相关
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.
POLLERR 可能会在 SOCK_DGRAM 上发生,如果您发送一个数据包并且任何 ICMP 错误引用该数据包(网络无法访问,主机无法访问,端口无法访问,...)。
由于 return 是异步的,因此写入本身会成功。
我一直在编写(使用全能的 C)一个在 UDP 中侦听的服务器。我有 2 个套接字在同一个端口(IPv4 和 IPv6)上侦听,我正在使用 poll() 来监视两个套接字。
那么,在收听时,处理轮询报告错误的正确方法是什么?是否可能收到 POLLHUP?如果可能,必须如何处理? POLLERR
也一样此外,是否可以接收 POLLRDBAND 或 POLLPRI?如果是,那么它意味着什么以及必须如何处理?
提前致谢。
PS:所有问题都与UDP相关
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.
POLLERR 可能会在 SOCK_DGRAM 上发生,如果您发送一个数据包并且任何 ICMP 错误引用该数据包(网络无法访问,主机无法访问,端口无法访问,...)。
由于 return 是异步的,因此写入本身会成功。