Освобождение связанных портов при выходе из процесса - PullRequest
16 голосов
/ 14 февраля 2009

Как убедиться, что сокет, связанный с портом, правильно освобожден при выходе из процесса, так что порт можно использовать повторно без сбоя bind() с EADDRINUSE? Я написал крошечную программу, которая просто создает сокет, привязывает его к фиксированному порту, ждет подключения и затем немедленно завершает работу. Когда я перезапускаю программу, вызов bind() завершается неудачно с EADDRINUSE, но если я подожду несколько минут, он завершится успешно.

Есть ли способ, которым я могу явно "отсоединить" сокет, тем самым освободив номер порта?

Ответы [ 3 ]

24 голосов
/ 14 февраля 2009

Использование опции сокета SO_REUSEADDR позволит вам перезапустить программу без задержки.

int iSetOption = 1;
...
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&iSetOption,
        sizeof(iSetOption))
...         
4 голосов
/ 14 февраля 2009

Стек TCP / IP поддерживает занятость порта в течение некоторого времени даже после close() - сокет останется в состоянии TIME_WAIT и TIME_WAIT2.

Если я не ошибаюсь, обычно это занимает 2 минуты, поэтому, если вам нужно использовать один и тот же порт, немедленно установите параметр SO_REUSEADDR на вашем сокете перед привязкой, как предложил Ivo Bosticky.

2 голосов
/ 05 января 2010

Не совсем ответ на ваш вопрос, но для полноты:

В Windows вы можете установить TcpTimedWaitDelay значение реестра, чтобы установить время ожидания для освобождения закрытых TCP-соединений до 30 секунд.

...