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::async_read 不回调我的处理函数