Я пытаюсь проверить, используется ли определенный порт в C ++. Я не пытаюсь заставить программу C ++ прослушивать этот порт по какой-либо причине, просто проверьте, не используется ли он. На этом порту будет прослушиваться другая программа, и если она остановится, я хочу, чтобы моя программа что-то сделала. Таким образом, он будет проверять каждые 10 секунд или около того, и если порт используется, он ничего не будет делать, но если порт станет доступным, что-то произойдет.
Я смотрел на улучшенную библиотеку ASIO, но не могу понять, как этого добиться.
Здесь есть два варианта.
Если вы действительно хотите проверить, используется ли порт, попробуйте выполнить привязку:
bool port_in_use(unsigned short port) {
using namespace boost::asio;
using ip::tcp;
io_service svc;
tcp::acceptor a(svc);
boost::system::error_code ec;
a.open(tcp::v4(), ec) || a.bind({ tcp::v4(), port }, ec);
return ec == error::address_in_use;
}
Смотрите это в прямом эфире: Жить на Колиру, правильно печатать
Port 1078 is in use
ПРЕДОСТЕРЕЖЕНИЕ могут быть и другие причины, по которым вы не можете привязаться к локальной конечной точке; сначала убедитесь, что у вас есть необходимые разрешения (ошибка разрешения здесь проглатывается)
Если вы действительно хотите проверить, что соединения принимаются, вам нужно будет установить соединение. Это может занять несколько больше времени, так что вы можете запустить это по таймауту:
bool accepting_connections(unsigned short port) {
using namespace boost::asio;
using ip::tcp;
using ec = boost::system::error_code;
bool result = false;
try
{
io_service svc;
tcp::socket s(svc);
deadline_timer tim(svc, boost::posix_time::seconds(1));
tim.async_wait([&](ec) { s.cancel(); });
s.async_connect({{}, port}, [&](ec ec) {
result = !ec;
});
svc.run();
} catch(...) { }
return result;
}
Тестовое задание:
int main() {
using namespace std;
if (accepting_connections(22))
cout << "Port 22 is accepting connections\n";
}
Других решений пока нет …