наблюдение за проблемой включения / выключения - PullRequest
0 голосов
/ 20 октября 2010

недавно я столкнулся с проблемой.Я использую две программы A и B, разработанные кем-то другим, которые используют TCP-сокеты для связи друг с другом, A является сервером, B является клиентом.Это то, что я заметил: когда я запускаю и A, и B, они запускаются и связываются друг с другом, если я сначала убью A, затем перезапущу A снова, теперь, проверяя процессы, A успешно запускается, но не может быть подключен с помощью Bнезависимо от того, перезагружаю ли я B. однако, если я продолжу уничтожать этот не обнаруживаемый A и снова запускаю A, он может быть обнаружен B.

В то же время, если я закрою сокет B перед уничтожением Aзатем, когда я запускаю A и B, они работают очень хорошо.

в чем проблема и есть ли способ увидеть открытые сокеты, когда я убиваю A?

1 Ответ

0 голосов
/ 20 октября 2010

Это зависит от используемой вами ОС.
lsof -p довольно часто встречается в UNIX и позволяет перечислять все файловые дескрипторы, используемые процессом.netstat, вероятно, доступен и будет также перечислять открытые порты.

Возможно, это связано с состоянием TIME_WAIT.Когда вы убиваете A, порт сервера по-прежнему выделяется ОС и может использоваться повторно, только если A устанавливает определенный флаг при открытии порта сервера, чтобы иметь возможность повторно использовать этот порт (SO_REUSEADDR).В противном случае A не сможет повторно использовать порт сервера, пока он не будет закрыт операционной системой (это может занять несколько минут, причина того, почему, когда вы продолжаете убивать A, в какой-то момент порт снова становится доступным).Я не знаю, что делает А, если из-за этого не может открыть порт сервера.

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