Как отладить нечистое закрытие сокета в C? - PullRequest
0 голосов
/ 19 января 2011

У меня есть сетевой демон (poll () / accept () / fork () style), который пропускает дескрипторы файлов сокетов, по одному на клиента в состоянии TIME_WAIT.

Насколько я вижу, я могу выключить () и затем закрыть () определенно ненужных сокетов. Другие сокеты (например, сокет сервера на стороне клиента форка) просто закрываются (). Для всех сокетов установлен SO_REUSEADDR, а SO_LINGER выключен. Я использую _exit () для выхода из программы, и я использую неблокирующие операции сокетов опроса, чтобы установить флаг '' умирающий '' в моем обработчике сигналов - это позволяет мне позже взять флаг умирания и освободить ( ), shutdown (), close (), которые в противном случае были бы опасны в обработчике сигналов.

Но все же утечка fd - Каков наилучший способ отладки такого рода проблемы? Было бы полезно узнать, какой сокет слоняется на выходе, так как в этом процессе задействовано много fds.

Ура!

Ответы [ 2 ]

2 голосов
/ 20 января 2011

Сокеты в режиме TIME_WAIT НЕ протекают - TIME_WAIT означает, что приложение завершило работу с сокетом, закрыло его и очистило, но ядро ​​все еще запоминает сокет, чтобы правильно реагировать на поздние / потерянные / дубликатыпакеты, которые могут быть в сети.Через некоторое время ядро ​​автоматически удалит сокеты TIME_WAIT, но до тех пор они останутся напоминанием ядру не использовать порт повторно, если приложение специально не запрашивает его с SO_REUSEADDR.

2 голосов
/ 20 января 2011

Я понял это.

Infact Я уже исправил ошибку, закрыв cli_fd на стороне сервера форка;однако я не заметил, что ошибка была исправлена, потому что я неправильно использовал natstat, чтобы открыть fds.

Для записи вывод netstat -n | grep TIME_WAIT | wc -l не должен использоваться для подсчета дескрипторов файлов для сокетов, которые торчат- это то, что я делал неправильно.Вместо этого используйте lsof или fstat.

В любом случае - на сервере больше не хватает fds при значительной нагрузке.

Cheers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...