更新:在调查 lil 之后,我发现了这种行为的真正问题。问题是,我正在为每个连接创建线程并将 sock fd 传递给线程,但没有立即 pthraed_joining,这样我的主线程就无法在连接接受后创建更多线程。我关闭套接字的逻辑是在子线程中,因为我无法关闭套接字,因此他们将进入等待关闭状态。所以我只是在创建线程后将它们分离,现在一切正常!
我有一个客户端服务器程序,我正在使用脚本来运行客户端并建立尽可能多的连接并在发送一行数据并退出客户端后关闭它们,一切正常,直到第 32739 个连接,即连接关闭双方和所有人,但在那个数字之后,连接没有关闭,服务器停止接收更多连接,如果这样做
netstat -tonpa 2>&1 | grep CLOSE
我看到大约 1020 个套接字等待关闭。从命令中采样,
tcp 25 0 192.168.0.175:16099 192.168.0.175:41704 CLOSE_WAIT 5250/./bl_manager off (0.00/0/0)
tcp 24 0 192.168.0.175:16099 192.168.0.175:41585 CLOSE_WAIT 5250/./bl_manager off (0.00/0/0)
tcp 30 0 192.168.0.175:16099 192.168.0.175:41679 CLOSE_WAIT 5250/./bl_manager off (0.00/0/0)
tcp 31 0 192.168.0.175:16099 192.168.0.175:41339 CLOSE_WAIT 5250/./bl_manager off (0.00/0/0)
tcp 25 0 192.168.0.175:16099 192.168.0.175:41760 CLOSE_WAIT 5250/./bl_manager off (0.00/0/0)
我正在使用以下代码来检测客户端断开连接。
for(fd = 0; fd <= fd_max; fd++) {
if(FD_ISSET(fd, &testfds)) {
if (fd == client_fd) {
ioctl(fd, FIONREAD, &nread);
if(nread == 0) {
FD_CLR(fd, &readfds);
close(fd);
return 0;
}
}
}
} /* for()*/
如果我做错了什么,请告诉我。它是一个 Python 客户端和 CPP 服务器设置。
谢谢你