Как предотвратить, чтобы сетевые порты оставались открытыми при сбое программы

StackOverflow https://stackoverflow.com/questions/1008608

Вопрос

Я принимал Computer Networking в прошлом семестре и занимался программированием на C на linux (используя gcc) для своих проектов. Одна чрезвычайно утомительная вещь, с которой я продолжал сталкиваться, заключалась в том, что если моя программа потерпела крах или остановилась (что мне тогда пришлось бы нажать Ctrl + C, чтобы убить ее), сетевой порт все равно оставался бы открытым в течение минуты или около того. Поэтому, если бы я хотел немедленно запустить программу снова, мне нужно было бы сначала зайти в файл заголовка, изменить порт, переделать программу, а затем, наконец, запустить ее. Очевидно, это становится очень утомительным и очень быстрым.

Есть ли способ настроить его так, чтобы порт был сразу же освобожден после завершения процесса? Либо через некоторые настройки в Linux, либо в make-файле для моей программы, либо даже программно в C?

Изменить. Я имею в виду, когда пишу сервер и выбираю определенный порт для размещения программы.

Это было полезно?

Решение

Установите параметр SO_REUSEADDR в сокете.

int yes = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));

Из Руководства Beej по сетевому программированию .

Другие советы

Бьюсь об заклад, это около двух минут :) Как заметил @Cogsy, опция сокета SO_REUSEADDR - ваш друг. Ознакомьтесь с состояниями TCP, это TIME_WAIT состояние, которое вызывает у вас проблемы:

 

Я предполагаю, что написанная вами программа является сервером, поэтому вам нужно использовать известный порт. Если это так, вы должны использовать опцию SO_REUSE_ADDR для сокета, как указал Cogsy.

Если, с другой стороны, вы пишете клиентский sw, вам следует избегать выбора конкретного порта, что позволяет системе выдавать вам случайный порт.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top