更新:詳細を調査した結果、この動作の本当の問題を発見しました。問題は、接続ごとにスレッドを作成し、sock fd をスレッドに渡していますが、すぐに pthraed_joining しなかったため、接続の受け入れ後にメインスレッドがそれ以上スレッドを作成できなくなったことです。ソケットを閉じる私のロジックは子スレッドにあります。そのため、ソケットを閉じることができなかったため、WAIT CLOSE状態になりました。だから私はそれらを作成した後にスレッドを切り離しただけで、今のところすべてうまくいきます!!
クライアントサーバープログラムがあり、スクリプトを使用してクライアントを実行し、可能な限り多くの接続を作成し、データ行を送信してクライアントを終了した後、それらを閉じます.32739番目の接続、つまり接続が閉じられるまで、すべてが正常に機能します両側とすべてを除いて、その数の後、接続は閉じられず、サーバーはそれ以上の接続の取得を停止します。
netstat -tonpa 2>&1 | grep CLOSE
約 1020 個のソケットが CLOSE を待っています。コマンドからのサンプル、
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 サーバーのセットアップです。
ありがとうございました