c++ - 通过接受关闭在另一个线程中使用的套接字的风险是什么?

标签 c++ c linux multithreading sockets

我有一个服务器应用程序。

服务器在线程中接受来自客户端的连接:

 while( (client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c)) )
{
     .....
 }

我有另一个线程在我的应用程序退出时执行。在这个线程中,我关闭了套接字 socket_desc:

close(socket_desc);

关闭线程中的套接字并且有另一个线程在同一个套接字上进行接受有什么风险?

最佳答案

我可能是错的。但是,它可能适用于这样的场景:- 考虑 3 个线程 - A、B、C。

  1. 线程 A 等待套接字并进入休眠状态
  2. 线程 B 关闭套接字
  3. 线程 C 创建一个新的套接字,它恰好获得与最近关闭的套接字相同的文件描述符编号(套接字也是一个文件)
  4. 线程 A 唤醒(在 accept 上有错误代码)然后调用 close thinking unexpected error => 这会影响在 C 中创建的完全不同的有效套接字!!

关于c++ - 通过接受关闭在另一个线程中使用的套接字的风险是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28239895/

相关文章:

c++ - 在哪里可以找到 std::bitset 的数据成员?

C - 按引用调用

c - 获取用户的国家和键盘语言

c - 使用 Intel MKL 的 3D 卷积

linux - 如何使用命令指令创建文件?

linux - yum 找不到我要安装的包

java - Java Swing 中不稳定的框架和窗口?

c++ - 自动将 JSON 数据迁移到最新版本的 JSON 模式

c++ - std::thread 的 drd 和 helgrind 支持的当前状态

c++ - Sum 1 ~ N,不使用乘法、除法、if、while、for、switch和三元表达式