Разница между "используемым адресом" с bind() в Windows и в Linux - errno=98

У меня есть небольшой TCP-сервер, который прослушивает порт. Во время отладки мне свойственно CTRL-C сервер, чтобы убить процесс.

В Windows я могу быстро перезапустить службу, и сокет может быть восстановлен. В Linux мне нужно подождать несколько минут, прежде чем bind() вернется с успехом

Когда bind() не работает, он возвращает errno=98, адрес используется.

Я хотел бы лучше понять различия в реализациях. Конечно, Windows более дружественна для разработчика, но я сомневаюсь, что Linux делает "неправильные вещи".

Я думаю, что Linux ждет, пока все возможные клиенты не обнаружат, что старый сокет сломан, прежде чем разрешить создание новых сокетов. Единственный способ сделать это - подождать, пока они истечут.

Есть ли способ изменить это поведение во время разработки в Linux? Я надеюсь дублировать способ, которым Windows делает это

1 ответ

Решение

Вы хотите использовать SO_REUSEADDR опция на сокете в линуксе. Соответствующая страница руководства socket(7), Вот пример его использования. Этот вопрос объясняет, что происходит.

Вот дубликат этого ответа.

В Linux SO_REUSEADDR позволяет привязать к адресу, если нет активного подключения. В Windows это поведение по умолчанию. В Windows SO_REUSEADDR позволяет дополнительно привязать несколько сокетов к одним и тем же адресам. Смотрите здесь и здесь для большего.

Другие вопросы по тегам