Освобождение связанных портов при выходе из процесса

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

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

Ответы

Ответ 1

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

int iSetOption = 1;
...
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&iSetOption,
        sizeof(iSetOption))
...         

Ответ 2

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

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

Ответ 3

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

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