Сокет остается открытым после закрытия программы (C ++) - PullRequest
6 голосов
/ 07 августа 2009

В настоящее время я пишу небольшое серверное приложение, и моя проблема в том, что когда я закрываю свое приложение (или, что еще лучше, нажимаю кнопку завершения в eclipse), сокет иногда остается открытым, поэтому при следующем запуске приложения time, bind () потерпит неудачу с «Адрес уже используется». Как правильно закрыть мои сокеты при выходе из программы? Я уже поставил

close(mySocket);

в деструкторах класса, но это, похоже, ничего не меняет.

Ответы [ 6 ]

5 голосов
/ 07 августа 2009
4 голосов
/ 07 августа 2009

Используйте netstat, чтобы выяснить, в каком состоянии находится ваша конечная точка. Я предполагаю, что она находится в TIME_WAIT и не полностью закрыта. Это правильное поведение для TCP, и оно существует, чтобы позволить прибывающим сегментам, которые могут все еще отсутствовать в эфире, поступать и не вызывать проблем. Длительность TIME_WAIT примерно равна 2 * MSL, то есть вдвое превышает максимальное время жизни сегмента в сети, таким образом гарантируя, что даже сегмент, который получает повторную передачу, будет обработан должным образом.

Как уже отмечали другие, SO_REUSEADDR ваш друг, если конечная точка дальней стороны каждый раз отличается. Это частый случай, но иногда люди делают странные вещи, такие как привязка клиента к определенному порту, и в этом случае вы все равно получите EADDRINUSE b / c TCP, определяющий сеанс как оба конечные точки.

3 голосов
/ 07 августа 2009

http://hea -www.harvard.edu / ~ fine / Tech / addrinuse.html должен ответить на многие ваши вопросы. Я склонен использовать SO_REUSEADDR, чтобы обойти эту проблему.

2 голосов
/ 07 августа 2009

Вы установили опцию SO_REUSEADDR? Судя по тому, что вы говорите, похоже, нет.

0 голосов
/ 07 августа 2009

Не забудьте проверить возвращаемое значение close. Он вернет 0, когда сокет будет успешно закрыт. В случае неудачи он вернет -1.

0 голосов
/ 07 августа 2009

Вы уверены, что ваше приложение все еще не работает в фоновом режиме?

...