boost.asio 如何发现我的服务器应用程序正在侦听哪个端口?

Posted

技术标签:

【中文标题】boost.asio 如何发现我的服务器应用程序正在侦听哪个端口?【英文标题】:How boost.asio discover which port is my server app listening on? 【发布时间】:2009-02-23 18:44:32 【问题描述】:

当客户端应用程序连接到服务器时,boost.asio 不使用基本概念对我来说有点奇怪 - 使用 IP 地址和端口。可能是我在 Boost 中有点菜鸟 - 我接受这一点 - 但无论如何我不明白。 所以,我有这样的代码让客户端连接到本地主机上的服务器:


        boost::asio::io_service io_service;
        tcp::resolver resolver(io_service);
        tcp::resolver::query query("localhost", "daytime"); 
        tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 
        tcp::resolver::iterator end;

        tcp::socket socket(io_service);
        boost::system::error_code error = boost::asio::error::host_not_found;
        while(error && endpoint_iterator != end) 
            socket.close();
            socket.connect(*endpoint_iterator++, error);
        

Windows 在其 WinSock 2.0 中使用两个参数 - IP 和端口 - 来识别服务器。 所以,问题是 - Asio 究竟是如何找出服务器在哪个端口上侦听连接的?它会扫描所有端口吗?如果是这样,如果两台服务器同时监听不同的端口会发生什么?

【问题讨论】:

【参考方案1】:

试试,

tcp::resolver::query query("localhost", boost::lexical_cast<string>(port));//assuming port is an int

要回答您的问题,请记住您在端口 13 上启动服务器。这恰好是运行 Linux 日间服务 (http://www.sorgonet.com/linux/linuxdaemons/) 的端口。因此,他们随后可以使用 query("localhost","daytime") 而不是指定端口。

【讨论】:

【参考方案2】:

你告诉它你想在日间服务使用的端口上连接到 localhost。它会在服务文件中查找相应的端口号(在Windows下通常是C:\WINDOWS\system32\drivers\etc\services,我相信在Unix下是/etc/services)。你也可以在那里使用一个明确的端口号。

【讨论】:

我不太明白第二个参数在查询 ctor 中的含义。第一个是我要连接的IP地址,对吧?第二个是什么意思? 第二个参数是端口号或服务名称。如果它是服务名称,asio 将在服务文件中查找它以找到该服务的适当端口号。使用文本编辑器查看服务文件,您将了解它是如何工作的。 好的,那么如何在我需要的端口上启动服务器?服务器端的代码是: boost::asio::io_service io_service; tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 13)); 我不明白你在问什么。该代码已经启动了一个监听端口 13(日间服务)的服务器。 daytime 实际上是使用端口 13 的 Windows 服务,即使我们的服务器没有运行。服务端设置使用13端口,客户端通过文件服务查看白天服务端口获取13端口。这就是为什么当您将服务器更改为其他端口时,客户端无法建立连接。【参考方案3】:

在 localhost 的端口 13 上打开 netcat 侦听 它将接受演示的连接。连接时输入一些 blabla,您将在演示程序中看到输出 要运行 netcat,请运行: nc -l -p 13

窗户?没有网猫?安装cygwin,添加netcat

【讨论】:

以上是关于boost.asio 如何发现我的服务器应用程序正在侦听哪个端口?的主要内容,如果未能解决你的问题,请参考以下文章

如何将此 Boost ASIO 示例应用于我的应用程序

boost::asio::async_read 不回调我的处理函数

C++ Boost Asio 简单聊天教程

Boost::asio - 如何中断阻塞的 tcp 服务器线程?

Boost::Asio 点对点 udp 聊天

如何将 boost.Asio 与 MJPEG 一起使用?