1 个线程正在 for(;;;) 循环中进行接受调用。在特定条件下,调用 closeSocket 并关闭正在进行接受调用的同一个套接字。 Accept 调用给出错误。 我在 Solaris 上收到 EBDAF 错误,在 Linux 上收到 EINVAL 错误。 我应该如何克服这个问题。 我可以在进行accept调用之前检查socketnum状态吗? 我应该如何解决这个问题。
最佳答案
当另一个线程正在使用套接字时,您无法在一个线程中关闭该套接字。基本问题是根本没有办法知道其他线程是否正在使用套接字或关于使用套接字。如果即将使用套接字,则存在不可避免的竞争条件。这一错误导致了现实世界的问题,其中包括具有严重安全隐患的问题。
相反,不要关闭套接字。向可能以其他方式使用套接字的线程发出信号,然后让该线程关闭套接字。
关于c++ - 在Linux中,当同一套接字上的accept()调用正在进行时,套接字描述符在某些条件下从另一个线程关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30921300/