2

pselectTCP 接続を待機している実行中です。それpselectは独自のスレッドで実行されているため、多数のスレッドを実行しています。

それらにタイムアウトを設定していますが、pselect実行するsockstatと、決して閉じられない接続があるようです。それらの99%がそうです。接続を確立しているクライアントを完全に閉じると、タイムアウト時間が経過すると、それらのソケットを閉じることができると思います。ゼロの戻り値をチェックするためにブレークポイントを配置しましたが、決して起こりません。

擬似的にこれは私が持っているものです

if((ret == pselect(..., timeout, NULL) <0 ){
//check errors
} else if (ret == 0)
{
//close connection for timing out
//I never land here, even though I can close the client side (thus presumably closing the connection)
}

それが私の問題である場合、デバッグするために他に何ができますか? sockstat で見ることはできますが、どのソケット fd が開いたままになっているのかを正確に判断するのは困難です。

4

1 に答える 1

2

elseもう一方の端から閉じられたソケットは読み取りと書き込みの両方が可能であるため、スレッドはおそらく (含まれていない) ケースで回転しています。タイムアウトのケースに入るには、タイムアウトの間、もう一方の端を開いたままにしておく必要があります。

(あなたがいる場合はPOLLHUP用語poll()です)

于 2013-01-19T01:23:12.247 に答える