I / O信号和处理程序

时间:2009-08-10 13:20:48

标签: c++ networking signals

我想为UDP端口指定一个回调,这样每次新数据包到达时,都会调用一个处理程序。

我知道使用fcntl()导致文件描述符引发SIGIO,但是让我们说事情并不那么简单。我有一个带有套接字a的对象A和一个带有套接字b的对象B.套接字a接收新数据包,因此引发SIGIO。但是,这仅影响对象A,与对象B无关。

当特定端口收到数据包时,如何确保调用特定功能?

3 个答案:

答案 0 :(得分:2)

我建议使用Boost.ASIO库。它专为异步I / O而设计。

答案 1 :(得分:1)

Boost.SignalsBoost.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与另一个。