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