我想为 UDP 端口指定一个回调,这样每次新数据包到达时,都会为它调用一个处理程序。
我知道使用 fcntl() 来导致文件描述符引发 SIGIO,但是让我们说事情并不是那么简单。我有一个带有套接字 a 的对象 A 和一个带有套接字 b 的对象 B。套接字 a 接收到一个新数据包,因此引发了 SIGIO。但是,这只影响对象 A,与对象 B 无关。
当特定端口接收数据包时,如何确保调用特定函数?
我想为 UDP 端口指定一个回调,这样每次新数据包到达时,都会为它调用一个处理程序。
我知道使用 fcntl() 来导致文件描述符引发 SIGIO,但是让我们说事情并不是那么简单。我有一个带有套接字 a 的对象 A 和一个带有套接字 b 的对象 B。套接字 a 接收到一个新数据包,因此引发了 SIGIO。但是,这只影响对象 A,与对象 B 无关。
当特定端口接收数据包时,如何确保调用特定函数?
我推荐使用Boost.ASIO库。它是为异步 I/O 设计的。
当特定端口接收数据包时,如何确保调用特定函数?
(这里的“端口”,我假设您是指代表您的 UDP 套接字的S_IFSOCK
文件描述符。)
您有许多可用于 I/O 驱动的应用程序的通用选项:阻塞读取器线程、与select(2)或poll(2)或类似的多路复用、请求信号通知(尤其是在处理程序中使用排队实时信号和额外信息SA_SIGINFO
) , 通过aio_read(2)进行异步 I/O 。有关简要概述,请参见此处。
更好的是,使用抽象出这些杂乱细节的第三方库,例如其他地方提到的 Boost.ASIO 或libevent。
套接字 a 接收到一个新数据包,因此引发了 SIGIO。但是,这只影响对象 A,与对象 B 无关。
嗯,不准确。信号被传递到(“由其处理”)进程中的线程,有时是您选择的线程,从这个意义上说,既不会直接影响对象 A,也不会直接影响对象 B。:) 你的意思是说普通人SIGIO
无法区分套接字 A 上的“数据准备就绪”和套接字 B 上的“数据就绪”吗?
如果是这样,那么不要使用普通的SIGIO
. 在 Linux 下,fcntl( F_SETSIG
)和SA_SIGINFO
具有实时信号的处理程序足以区分一个就绪 fd 和另一个。
Boost.Signals或Boost.Signals2(线程安全版本)可能对您有用。