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

Posted

技术标签:

【中文标题】使用 C++ 和 Boost(或不使用?)检查是不是正在使用特定端口?【英文标题】:Using C++ and Boost (or not?) to check if a specific port is being used?使用 C++ 和 Boost(或不使用?)检查是否正在使用特定端口? 【发布时间】:2016-01-26 07:04:05 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

这里有两个选项。

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

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;

实时查看:Live On Coliru,正确打印

Port 1078 is in use

CAVEAT 可能有其他原因导致您无法绑定到本地端点;先检查你是否有需要的权限(这里吞下了权限错误)

如果您真的想检查连接是否被接受,则必须建立连接。这可能会比较耗时,因此您可能希望在超时后运行它:

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";

【讨论】:

在新的 boost asio 中,您可以在一行中使用 tcp::acceptor a(svc, tcp::v4(), port) 而不是调用 open 和 bind。【参考方案2】:

正如@sehe 所说,尝试绑定是正确的方法。

a.bind( tcp::v4(), port , ec)

该方法仅检测0.0.0.0:port 上的端口是否正在使用。

如果你想看看你的程序是否可以监听127.0.0.1:port它们是不同的套接字),试试

a.bind(tcp::endpoint(ip::address::from_string("127.0.0.1"), port), ec)

【讨论】:

以上是关于使用 C++ 和 Boost(或不使用?)检查是不是正在使用特定端口?的主要内容,如果未能解决你的问题,请参考以下文章

C++:检查字符串是不是是有效的 MD5 十六进制哈希

使用 Excel VBA 检查字符串是不是在数组中或不包括通配符

Azure Storage Java API:检查存储帐户是不是支持安全传输或不使用 java SDK

boost 库是不是依赖于 std C++ 库?

如何检查 ViewBag 属性是不是为空或不存在

使用 Boost Graph [BGL] 检查在 add_edge 之前是不是已经存在顶点