当有数据到达 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/