Как предотвратить, чтобы сетевые порты оставались открытыми при сбое программы - PullRequest
4 голосов
/ 17 июня 2009

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

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

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

Ответы [ 3 ]

11 голосов
/ 17 июня 2009

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

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

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

2 голосов
/ 17 июня 2009

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

<img src="https://www.cs.mtu.edu/vta/tcp-state-diagram.jpg" width="500" height="500"> 
1 голос
/ 17 июня 2009

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

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

...