当在Linux上进行同一套接字上的accept()调用时,套接字描述符在某种情况下从另一个线程关闭了吗?

时间:2015-06-18 16:51:25

标签: c++ linux sockets networking solaris

1个线程在(;;;)循环中进行接受调用。在某个条件下调用closeSocket并关闭正在进行接受调用的同一个套接字。 接受调用给出了错误。 我在Solaris上出现EBDAF错误,在Linux上出现EINVAL错误。 我该如何克服这个问题。 我可以在接听电话之前检查socketnum状态。 我应该如何处理这个问题。

2 个答案:

答案 0 :(得分:1)

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

相反,只是不要关闭套接字。以任何其他方式发信号通知可能正在使用套接字的线程,然后让该线程关闭套接字。

答案 1 :(得分:0)

accept将返回错误,因为套接字(文件描述符)已关闭。您可以在代码中考虑此错误。

在许多应用程序中常见错误的替代技术(Thrift使用它):从第二个线程连接到此套接字并发送特殊消息,例如,只是“1”。当服务器收到此消息时,它完成循环并关闭套接字。

当然,如果另一台机器开始向您的服务器发送“1”,则存在DoS攻击的风险。然后,您需要检查来自同一台计算机和进程使用的端口的消息。或者更好,做马丁詹姆斯在下面说的话。