c++ - 在Linux中,当同一套接字上的accept()调用正在进行时,套接字描述符在某些条件下从另一个线程关闭?

标签 c++ linux sockets networking solaris

1 个线程正在 for(;;;) 循环中进行接受调用。在特定条件下,调用 closeSocket 并关闭正在进行接受调用的同一个套接字。 Accept 调用给出错误。 我在 Solaris 上收到 EBDAF 错误,在 Linux 上收到 EINVAL 错误。 我应该如何克服这个问题。 我可以在进行accept调用之前检查socketnum状态吗? 我应该如何解决这个问题。

最佳答案

当另一个线程正在使用套接字时,您无法在一个线程中关闭该套接字。基本问题是根本没有办法知道其他线程是否正在使用套接字或关于使用套接字。如果即将使用套接字,则存在不可避免的竞争条件。这一错误导致了现实世界的问题,其中包括具有严重安全隐患的问题。

相反,不要关闭套接字。向可能以其他方式使用套接字的线程发出信号,然后让该线程关闭套接字。

关于c++ - 在Linux中,当同一套接字上的accept()调用正在进行时,套接字描述符在某些条件下从另一个线程关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30921300/

相关文章:

c++ - 通过结构将动态数组传递给 pthreads

c++ - 在 cout 中显示数字十进制格式而不是指数

linux - 在一行中调用多行 (G)AWK 程序

linux - 在 while read (stdin) 循环后暂停 bash 脚本

perl - 我如何在 Perl 中使用套接字?有模块吗?

c++ - 抽象声明符 Node* 用作声明

c++ - 与返回引用而不是指针相关的限制

python - 如何使用单个 python 文件向服务器发出命令并向 DUT 发出延迟 5 秒的命令

Java套接字读取错误异常与返回码

node.js - wifi 掉线时本地套接字绑定(bind)失败