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