Освобождение связанных портов при выходе из процесса
Как я могу убедиться, что сокет, привязанный к порту, правильно выпущен при завершении процесса, так что порт можно повторно использовать без 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 секунд.