linux - UDP 套接字上的接收通知

标签 linux sockets signals

当有数据到达 LINUX 中的 UDP 套接字时,有什么方法可以通知应用程序?

我的意思是我们是否有任何信号可以完成这项工作。

非常感谢。

最佳答案

(尽管如果有人对您的措辞感到迂腐,那就不是)。

当数据到达 UDP 套接字时,您无法收到通知,但当套接字准备就绪时,您可以收到通知。

不同之处在于数据报可能到达但被丢弃(校验和错误、缓冲区已满等),因此您可能永远无法读取它。在一些较旧的 Linux 版本上,您仍然可以获得准备就绪通知,但这已在 2.6 早期版本的某处修复。您现在应该只在接收缓冲区中实际可以读取某些内容时才收到准备就绪通知。也就是说,您至少可以执行一个不会阻塞的 recvfrom(请注意,您无法真正区分“就绪,1 个数据报可用”和“就绪,10 个数据报可用”)而不是尝试直到获得 EAGAIN)。

有几种方法可以获取准备就绪通知。您要求的特定方式可以通过使用fcntl 设置O_ASYNC 来获得,这需要SIGIO 的信号处理程序。请参阅文档:[1] [2] .

或者,您可以使用 select(最便携)、poll(便携)或 epoll(仅限 Linux),这让您进程阻塞,直到事件发生。
大多数人都喜欢这种方法,因为它不涉及信号处理程序,而且通常更加直观和用户友好(提供例如级别触发的语义)。

关于linux - UDP 套接字上的接收通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29209029/

相关文章:

c++ - 核心转储和 gcov 覆盖率报告

java - 苹果推送通知服务(APNS): Feedback Service Response has missing byte?

python - Python中的非阻塞套接字

unix - 从 Coredump 中查找 UNIX 信号的来源

c++ - 如何在Linux终端应用程序中检测XOFF和XON

python - 用三角方法计算傅里叶级数

c - 用于匹配非 ASCII 流中的模式的 Regcomp 替代方案

linux - 在 32 位操作系统上运行 64 位 jvm

linux - Subversion 提交在第一个文件后无限期挂起

python - 将传出套接字绑定(bind)到特定(虚拟)适配器