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

     2023-03-17     188

关键词:

【中文标题】使用 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)

【讨论】:

谷物和 Boost 序列化是不是使用零拷贝?

】谷物和Boost序列化是不是使用零拷贝?【英文标题】:DocerealandBoostSerializationusezero-copy?谷物和Boost序列化是否使用零拷贝?【发布时间】:2017-06-0716:42:00【问题描述】:我对几种序列化协议进行了一些性能比较,包括FlatBuffers、... 查看详情

如何检查 ReportControl 对象上是不是存在 Reportid 或不使用 *ngif?

】如何检查ReportControl对象上是不是存在Reportid或不使用*ngif?【英文标题】:HowtocheckReportidexistonReportControlobjectornotusing*ngif?如何检查ReportControl对象上是否存在Reportid或不使用*ngif?【发布时间】:2020-09-1018:02:24【问题描述】:我... 查看详情

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

...AzureStorageJavaAPI:检查存储帐户是不是支持安全传输或不使用javaSDK【英文标题】:AzureStorageJavaAPI:CheckifstorageaccountsupportsecuretransferornotusingjavaSDKAzureStorageJavaAPI:检查存储帐户是否支持安全传输或不使用javaSDK【发布时间】:2019-09-28... 查看详情

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

】使用ExcelVBA检查字符串是不是在数组中或不包括通配符【英文标题】:CheckifstringisinarrayornotincludingwildcardswithExcelVBA使用ExcelVBA检查字符串是否在数组中或不包括通配符【发布时间】:2017-03-2909:48:41【问题描述】:我发现这个函... 查看详情

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

...很小是有原因的,所以我们一直小心不要因为大小而实际使用标准C++库。我的问题是,使用boost 查看详情

使用 C++ 和 Boost::Asio 的 N 方客户端到客户端通信

】使用C++和Boost::Asio的N方客户端到客户端通信【英文标题】:N-partyclient-to-clientcommunicationusingC++andBoost::Asio【发布时间】:2012-02-1410:22:31【问题描述】:我一直在使用Boost::Asio并检查它在n个独立用户协作计算共享输入上的函数时... 查看详情

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

】使用BoostGraph[BGL]检查在add_edge之前是不是已经存在顶点【英文标题】:Checkifvertexalreadyexistsbeforeanadd_edgeusingBoostGraph[BGL]使用BoostGraph[BGL]检查在add_edge之前是否已经存在顶点【发布时间】:2017-03-3010:00:38【问题描述】:有没有办法... 查看详情

如何使用 C++ 检查进程是不是正在运行

】如何使用C++检查进程是不是正在运行【英文标题】:HowtocheckifaprocessisrunningornotusingC++如何使用C++检查进程是否正在运行【发布时间】:2012-05-1714:49:47【问题描述】:如果一个进程没有运行,我不应该显示某些上下文菜单选项?... 查看详情

在 windows 中,如何使用 c++ 检查端口是不是免费

】在windows中,如何使用c++检查端口是不是免费【英文标题】:inwindows,howtocheckportisfreeornotbyusingc++在windows中,如何使用c++检查端口是否免费【发布时间】:2014-09-1206:43:26【问题描述】:在windows中,如何使用c++检查端口是否空闲(... 查看详情

如何检查语句字符串是不是包含 C++ 中的单词? [关闭]

...串是否包含单词。现在的问题是,他们在整个互联网上都使用string::find或boost库,但这些方法的问题是它只检测没 查看详情

以编程方式检查 Windows 是不是已使用 C++ 激活

】以编程方式检查Windows是不是已使用C++激活【英文标题】:ProgrammaticallyCheckifWindowsisActivatedwithC++以编程方式检查Windows是否已使用C++激活【发布时间】:2017-09-1423:07:47【问题描述】:我正在尝试编写一个C++函数,它会告诉用户他... 查看详情

如何使用 Qt (C++) 检查程序是不是按其名称运行

】如何使用Qt(C++)检查程序是不是按其名称运行【英文标题】:HowtocheckifaprogramisrunningbyitsnamewithQt(C++)如何使用Qt(C++)检查程序是否按其名称运行【发布时间】:2012-11-2920:05:17【问题描述】:如何使用Qt(C++)通过名称检查程序是否正... 查看详情

使用 C++ 和 BOOST 读取 JSON 文件

】使用C++和BOOST读取JSON文件【英文标题】:ReadingJSONfilewithC++andBOOST【发布时间】:2015-01-0217:32:00【问题描述】:HTTP服务器向我发送这样的JSON响应(字符串):"folders":["id":109,"parent_id":110,"path":"\\/1\\/105\\/110\\/","id":110,"parent_id":105,"... 查看详情

使用相等 (===) 或不相等 (!==) 运算符是不是更高效?

】使用相等(===)或不相等(!==)运算符是不是更高效?【英文标题】:Isitmoreperformanttouseequal(===)orunequal(!==)operator?使用相等(===)或不相等(!==)运算符是否更高效?【发布时间】:2019-05-1919:32:13【问题描述】:如果它检查字符串的每个... 查看详情

使用 boost 和标准 C++ 的 Unicode 安全查找

】使用boost和标准C++的Unicode安全查找【英文标题】:UnicodesafefindusingboostandstandardC++【发布时间】:2015-09-3012:44:00【问题描述】:考虑以下sn-p:namespacebl=boost::locale;staticbl::generatorgen;staticautoloc=gen("en_US.UTF-8");std::stringfoo8=u8"Föo";s 查看详情

使用 C++ Boost 或 STL 和 Mysql 存储和检索图像

】使用C++Boost或STL和Mysql存储和检索图像【英文标题】:StoringandRetrievingImagesusingC++BoostorSTLandMysql【发布时间】:2011-07-2620:43:28【问题描述】:我正在尝试将图像保存到我的MySQL。有谁知道如何使用Boost或STL执行此操作?任何有用的... 查看详情

使用 C++ 和 Boost 获取当前时间(以毫秒为单位)

】使用C++和Boost获取当前时间(以毫秒为单位)【英文标题】:GetcurrenttimeinmillisecondsusingC++andBoost【发布时间】:2011-10-0717:48:40【问题描述】:在我的线程中(使用boost::thread)我需要以毫秒或更短的时间检索当前时间并转换为毫... 查看详情

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

...的有效MD5十六进制哈希?请记住,我想避免循环,我不能使用C++11中的boost库和正则表达式。【问题讨论】:让我们尝试回答“什么是有效的md 查看详情