I/O 信号和处理程序
我想为 UDP 端口指定一个回调,以便每次新数据包到达时,都会调用一个处理程序。
我知道使用 fcntl() 来导致文件描述符引发 SIGIO,但我们可以说事情并不是那么简单。 我有一个带有套接字 a 的对象 A 和一个带有套接字 b 的对象 B。 套接字 a 收到一个新数据包,因此引发一个 SIGIO。 但是这只影响对象A,与对象B无关。
如何保证特定端口收到数据包时调用特定函数?
I want to designate a callback for UDP port such that every time a new packet arrives, a handler is called for it.
I know about using fcntl() to cause file descriptors to raise SIGIO, but let's say things aren't quite that simple. I have an object A with socket a and an object B with socket b. Socket a receives a new packet, and therefore raises a SIGIO. This only affects object A, however, and has nothing to do with object B.
How can I ensure a specific function is called when a specific port receives a packet?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
(这里的“端口”,我假设您转喻表示代表您的 UDP 套接字的
S_IFSOCK
文件描述符。)您有许多常规选项 em> 适用于 I/O 驱动的应用程序:阻塞读取器线程、与 select(2) 或 poll(2) 或类似方法复用、请求信号通知(特别是在
SA_SIGINFO
处理程序中使用排队实时信号和额外信息),通过 aio_read(2) 进行异步 I/O。 请参阅此处了解简要概述。更好的是,使用第三方库来抽象出这些混乱的细节,例如其他地方提到的 Boost.ASIO 或 libevent。
,不完全是。 信号被传递到进程中的线程(有时是您选择的线程)(“由其处理”),从这个意义上说,信号既不直接影响对象 A 也不直接影响对象 B。 :) 您是否可能意味着普通的
SIGIO
无法区分套接字 A 上的“数据就绪”和套接字 B 上的“数据就绪”?如果是这样,那么不要使用普通的
SIGIO
。 在 Linux 下,fcntl(F_SETSIG
)< /a> 和带有实时信号的SA_SIGINFO
处理程序足以区分一个就绪的 fd 和另一个。(By "port" here, I assume you metonymously mean the
S_IFSOCK
file descriptor that represents your UDP socket.)You have many general options available for I/O-driven apps: blocking reader threads, multiplexing with select(2) or poll(2) or similar, requesting signal notification (esp. using queuing real time signals and extra info in an
SA_SIGINFO
handler), asynchronous I/O via aio_read(2). See here for a brief overview.Better yet, use a third party library that abstracts away these messy details, like the elsewhere-mentioned Boost.ASIO or libevent.
Well, not precisely. Signals are delivered to ("handled by") a thread within a process, sometimes a thread of your choosing, and in that sense affect neither object A nor object B directly. :) Do you perhaps mean that a plain
SIGIO
cannot discriminate "data ready" on socket A from that on socket B?If so, then don't use a plain
SIGIO
. Under Linux, fcntl(F_SETSIG
) and anSA_SIGINFO
handler with real time signals are enough to discriminate one ready fd from another.Boost.Signals 或 Boost.Signals2(线程安全版本)可能对您有用。
Boost.Signals or Boost.Signals2 (thread-safe version) may be of use to you.
我建议使用 Boost.ASIO 库。 它是为异步 I/O 而设计的。
I recommend using Boost.ASIO library. It is designed for asynchronous I/O.