Как предотвратить, чтобы сетевые порты оставались открытыми при сбое программы
-
06-07-2019 - |
Вопрос
Я принимал Computer Networking в прошлом семестре и занимался программированием на C на linux (используя gcc) для своих проектов. Одна чрезвычайно утомительная вещь, с которой я продолжал сталкиваться, заключалась в том, что если моя программа потерпела крах или остановилась (что мне тогда пришлось бы нажать Ctrl + C, чтобы убить ее), сетевой порт все равно оставался бы открытым в течение минуты или около того. Поэтому, если бы я хотел немедленно запустить программу снова, мне нужно было бы сначала зайти в файл заголовка, изменить порт, переделать программу, а затем, наконец, запустить ее. Очевидно, это становится очень утомительным и очень быстрым.
Есть ли способ настроить его так, чтобы порт был сразу же освобожден после завершения процесса? Либо через некоторые настройки в Linux, либо в make-файле для моей программы, либо даже программно в C?
Изменить. Я имею в виду, когда пишу сервер и выбираю определенный порт для размещения программы.
Решение
Установите параметр SO_REUSEADDR
в сокете.
int yes = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
Другие советы
Бьюсь об заклад, это около двух минут :)
Как заметил @Cogsy, опция сокета SO_REUSEADDR
- ваш друг.
Ознакомьтесь с состояниями TCP, это TIME_WAIT
состояние, которое вызывает у вас проблемы:
Я предполагаю, что написанная вами программа является сервером, поэтому вам нужно использовать известный порт. Если это так, вы должны использовать опцию SO_REUSE_ADDR для сокета, как указал Cogsy.
Если, с другой стороны, вы пишете клиентский sw, вам следует избегать выбора конкретного порта, что позволяет системе выдавать вам случайный порт.