I/O 信号和处理程序

发布于 2024-07-30 13:35:52 字数 224 浏览 3 评论 0原文

我想为 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

野生奥特曼 2024-08-06 13:36:29

如何确保在调用时调用特定函数
特定端口收到数据包?

(这里的“端口”,我假设您转喻表示代表您的 UDP 套接字的 S_IFSOCK文件描述符。)

您有许多常规选项 em> 适用于 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)< /a> 和带有实时信号的 SA_SIGINFO 处理程序足以区分一个就绪的 fd 和另一个。

How can I ensure a specific function is called when a
specific port receives a packet?

(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.

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.

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 an SA_SIGINFO handler with real time signals are enough to discriminate one ready fd from another.

-黛色若梦 2024-08-06 13:36:20

Boost.SignalsBoost.Signals2(线程安全版本)可能对您有用。

Boost.Signals or Boost.Signals2 (thread-safe version) may be of use to you.

薯片软お妹 2024-08-06 13:36:13

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

I recommend using Boost.ASIO library. It is designed for asynchronous I/O.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文