使用 C++ 和 Boost(或不使用?)来检查是否正在使用特定端口?

Con*_*ick 2 c++ port boost listen

我正在尝试检查 C++ 中是否正在使用特定端口。我不会出于任何原因尝试让 C++ 程序在该端口上侦听,只需检查它是否正在被使用。将有另一个程序在该端口上侦听,如果它停止,我希望我的程序执行某些操作。所以,它会每 10 秒左右检查一次,如果端口正在使用,它什么也不做,但如果端口可用,就会发生一些事情。

我一直在研究 boost ASIO 库,但我似乎无法弄清楚如何实现这一点。

seh*_*ehe 6

这里有两个选择。

如果你真的想检查端口是否被使用,只需尝试绑定:

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;
}
Run Code Online (Sandbox Code Playgroud)

现场观看:Live On Coliru,正确打印

Port 1078 is in use
Run Code Online (Sandbox Code Playgroud)

注意可能还有其他原因导致您无法绑定到本地端点;首先检查您是否具有所需的权限(权限错误在这里被吞下)

如果您确实想检查连接是否被接受,则必须建立连接。这可能会更耗时,因此您可能希望在超时情况下运行它:

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;
}
Run Code Online (Sandbox Code Playgroud)

测试:

int main() {
    using namespace std;

    if (accepting_connections(22))
        cout << "Port 22 is accepting connections\n";
}
Run Code Online (Sandbox Code Playgroud)