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