怎样使用Boost Asio建立非凡的客户端和服务端应用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样使用Boost Asio建立非凡的客户端和服务端应用相关的知识,希望对你有一定的参考价值。

参考技术A 1.建议使用一个socket专门接收数据,一个socket专门负责发送数据。2.如果使用一个socket既发送又接收,很可能出现这样的问题(如果该socket正在接收数据,而又想同时发送数据,你会想到什么后果吗?)

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

【中文标题】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 的 IOCP CompletionKey?

使用 boost::asio 获取广播源 IP 地址

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

使用 Boost.ASIO [WebSocket] 完整阅读消息

使用 boost-asio 的 C++ 和 Python 程序之间的客户端服务器

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