【发布时间】:2017-06-20 12:43:05
【问题描述】:
我正在从我的应用程序中删除 boost(因为我想在使用 pre c++ 11 时摆脱 boost),作为其中的一部分,我遇到了以下问题。
我有一段代码使用 boost(async_connect、async_write 和 async_read 调用)异步连接、请求和接收来自远程服务器的数据。我打算用异步模式下运行的 linux 原生套接字替换它。
同样,我开始关注 ioctl(_sockfd, FIOASYNC, &on); 将套接字设置为异步模式。 接下来我也设置 fcntl(_sockfd, F_SETOWN, getpid()); 将所有与 sockfd 相关的信号定向到创建套接字的进程。 处理 SIGIO 信号可以访问包含各种信号相关信息的 siginfo_t 结构。
但是我无法从接收到的 siginfo 结构实例中获取 sockfd,这使得很难破译哪个 sockfd;s SIGIO 信号已被捕获。 si->si_fd 与调用 connect 的 _sockfd 不匹配。 为什么 SIGINFO for SIGIO 中的 fd 与生成此信号的 sockfd 不匹配。 siginfo的内容还靠谱吗?
【问题讨论】:
-
我建议你忽略信号 API 并使用 select() 或 poll() 来实现你的套接字处理,信号不能很好地与多线程或面向对象的设计配合使用,如果你需要异步套接字并用 C++ 编写代码,很有可能两者都需要。
-
您在使用 sigaction() 建立信号处理程序时是否设置了
SA_SIGINFO?另见stackoverflow.com/questions/19866754/…
标签: c++ sockets asynchronous boost struct