当LINUX中的UDP套接字上有数据到达时,有没有办法让应用程序收到通知?
我的意思是我们有任何信号可以完成这项工作。
非常感谢。
答案 0 :(得分:3)
是(虽然如果一个人对你的措辞很迂腐,那就没有了。)
当数据到达UDP套接字时,无法通知,但只要套接字准备就绪,就可以通知
。不同之处在于数据报可能会到达但被丢弃(校验和错误,缓冲区已满等),因此您可能永远无法读取它。在一些较旧的Linux版本上,您仍然可以获得准备就绪通知,但这已经在2.6的早期版本中得到修复。现在,您应该只在实际可以在接收缓冲区中读取某些内容时获得准备就绪通知。也就是说,您可以至少执行一次recvfrom
来阻止(请注意,您无法区分"准备好,1个数据报可用"和&# 34;准备好,10个数据报可用"除了尝试直到你得到EAGAIN
)。
有几种方法可以获得有关准备情况的通知。您可以使用fcntl
设置O_ASYNC
来获取您要求的特定方式,这需要SIGIO
的信号处理程序。请参阅文档:[1] [2]。
或者,您可以使用select
(最便携),poll
(可移植)或epoll
(仅限Linux),这样您的流程就会阻止,直到事件发生。
这种方法是大多数人喜欢的方法,因为它不涉及单一处理程序,并且通常更直观和用户友好(提供例如级别触发的语义)。