Я написал это небольшое серверное приложение в чистом C, которое слушает входящие соединения в данном порту, очень простые вещи.Как правильно поддерживать порт прослушивания в течение длительного времени?
Это идет с обычной процедурой инициализации сокета, создать socket()
затем bind()
к порту, говорит сво listen()
и ifinitely петли через select()
ожидая входящие соединения с accept()
.
Все идет отлично и работает как шарм, за исключением того, что если я оставлю все, что работает в течение пары месяцев, порт прослушивания закрывается, пока сервер приложений не знает об этом, так как я написал его, чтобы доверять прослушивающему сокету не будет закрываться, если не будет сказано.
Итак, вопрос в том, что, черт возьми, порт закрыт без беспокойства моего приложения и что я могу сделать, чтобы предотвратить его?
Ожидаемое поведение? Должен ли я проверить какие-то исключения или сделать «проверку работоспособности» в гнезде для прослушивания, если это необходимо?
Код: https://gist.github.com/Havenard/e930be035a3bee75c018 (да, я понимаю, что я использую 0
в реплике на наличие ошибок, и это плохо pratice и прочее, но это не имеет отношения к вопросу, как я объяснил в комментариях, когда я устанавливаю дескриптора файла сокета для 0
- остановить цикл и закрыть приложение).
Это не нормально. Я бы заподозрил утечку ресурсов в вашем приложении, например, закончил файловые дескрипторы, потому что вы не закрываете новый сокет, возвращаемый accept(). – rhashimoto
Записываются дескрипторы, и обслуживание редко используется. Обычно он не получает новых соединений в течение нескольких недель. Кроме того, это не проблема accept(). Порт действительно закрывается, он disasppears из списка netstat, и другие приложения могут привязываться к этому порту, как будто ничего не использует. – Havenard
Select() приведет к сообщению о недопустимом filedescriptor/error'd. Может быть, вы закрыли его dup2() над ним? – wildplasser