【问题标题】:POLL handling with UDP使用 UDP 处理 POLL
【发布时间】:2023-03-09 20:16:01
【问题描述】:

我一直在(用全能的 C 语言)编写一个侦听 UDP 的服务器。我有 2 个套接字在同一个端口(IPv4 和 IPv6)上监听,并且我使用 poll() 来监视两个套接字。

那么,在收听时,处理 poll revents erros 的正确方法是什么?是否有可能收到 POLLHUP?如果可能,必须如何处理? POLLERR 也是如此

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

提前致谢。

PS:所有问题都与 UDP 相关

【问题讨论】:

  • 除非您通过已连接的 UDP 套接字发送到无法到达的目的地,否则您不太可能会收到任何错误,在这种情况下,您应该断开套接字并停止发送到该目的地.如果你得到任何其他错误,它可能是致命的,所以你应该关闭套接字并退出。

标签: c linux udp handle polling


【解决方案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.

【讨论】:

  • Niceeeee 回答埃默森先生。非常感谢! :)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    相关资源
    最近更新 更多