разница между "используемым адресом" с bind () в Windows и в Linux - errno = 98 - PullRequest
1 голос
/ 12 февраля 2011

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

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

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

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

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

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

1 Ответ

4 голосов
/ 12 февраля 2011

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

Вот копия этого ответа.

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

...