Как определить, используется ли порт в C на Linux? - PullRequest
3 голосов
/ 21 ноября 2010

Я пишу простой веб-сервер. Я хотел бы позволить пользователю установить порт, который слушает сервер, но как я могу узнать, используется ли уже введенный пользователем порт или нет? (если я знаю, что он уже используется, я могу сказать им ввести другой.)

Ответы [ 5 ]

8 голосов
/ 21 ноября 2010

Просто попробуйте bind к порту, и, если он потерпит неудачу, проверьте EADDRINUSE в errno.Это единственный способ, поскольку для правильности любая такая проверка должна быть атомарной.Если вы сделали отдельную проверку, а затем попытались привязаться к порту, обнаружив, что он не используется, другой процесс может подключиться к порту за это время, что снова приведет к его отказу.Точно так же, если вы сделали отдельную проверку и обнаружили, что порт уже используется, процесс, который использовал его, мог закрыть порт, выйти из него или завершиться сбоем за прошедшее время, снова делая результат неправильным.из всего этого (причина, по которой я написал длинный, а не короткий ответ), заключается в том, что правильный, надежный способ проверки «Могу ли я делать то-то и то-то?»почти всегда на попробуйте сделать это и проверить на сбой.Любой другой подход может привести к условиям гонки, и во многих случаях условия гонки (хотя, вероятно, не ваши) являются рангом уязвимостей безопасности.

5 голосов
/ 21 ноября 2010

bind() не удастся:

В случае успеха возвращается ноль.При ошибке возвращается -1, и errno устанавливается соответствующим образом.

EADDRINUSE Данный адрес уже используется.

0 голосов
/ 22 ноября 2010

Просто создайте сокет и вызовите bind (). В случае успеха bind () перейдите к listen (), в противном случае вам следует выполнить некоторую процедуру обработки ошибок, например переключиться на порт по умолчанию, напечатать сообщение об ошибке и дождаться взаимодействия с пользователем, или, по крайней мере, войти и выйти.

0 голосов
/ 21 ноября 2010

если bind () показывает какую-то ошибку

0 голосов
/ 21 ноября 2010

Другой подход: попробуйте подключиться к этому порту на localhost.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...