asio(六)、同步tcp客户端
创始人
2025-06-01 06:30:43
0

官网教程:https://think-async.com/Asio/asio-1.26.0/doc/asio/tutorial/tutdaytime1.html

同步tcp客户端

我们首先包括必要的头文件。

#include 
#include 
#include 

这个应用程序需要用户指定服务器。

using asio::ip::tcp;int main(int argc, char* argv[])
{try{if (argc != 2){std::cerr << "Usage: client " << std::endl;return 1;}

所有使用asio的程序都需要至少有一个I/O执行上下文,例如io_context对象。

asio::io_context io_context;

我们需要将指定为应用程序参数的服务器名称转换为TCP端点。为此,我们使用了一个ip::tcp::resolver 对象。

tcp::resolver resolver(io_context);

解析程序获取主机名和服务名,并将它们转换为端点列表。我们使用argv[1]中指定的服务器名称和服务名称(在本例中为“day”)执行解析调用。

端点列表使用类型为ip::tcp::resolver::results_type的对象返回。这个对象是一个范围,包含可用于迭代结果的begin()和end()成员函数。

 tcp::resolver::results_type endpoints =resolver.resolve(argv[1], "daytime");

现在我们创建并连接套接字。上面获得的端点列表可能同时包含IPv4和IPv6端点,因此我们需要尝试其中的每一个,直到找到一个有效的端点。这使客户端程序独立于特定的IP版本。asio::connect()函数会自动为我们执行此操作。

    tcp::socket socket(io_context);asio::connect(socket, endpoints);

连接已打开。我们现在所需要做的就是阅读日间服务的回复。

我们使用boost::array来保存接收到的数据。asio::buffer()函数自动确定数组的大小,以帮助防止缓冲区溢出。我们可以使用char[]或std::vector或std::array来代替boost::array。

    for (;;){boost::array buf;asio::error_code error;size_t len = socket.read_some(asio::buffer(buf), error);

当服务器关闭连接时,ip::tcp::socket::read_some()函数将退出,并出现asio::error::eof error,这就是我们知道退出循环的方式。

      if (error == asio::error::eof)break; // Connection closed cleanly by peer.else if (error)throw asio::system_error(error); // Some other error.std::cout.write(buf.data(), len);}

最后,处理可能引发的任何异常。

  }catch (std::exception& e){std::cerr << e.what() << std::endl;}
#include 
#include 
#include using asio::ip::tcp;int main(int argc, char* argv[])
{try{if (argc != 2){std::cerr << "Usage: client " << std::endl;return 1;}asio::io_context io_context;tcp::resolver resolver(io_context);tcp::resolver::results_type endpoints =resolver.resolve(argv[1], "daytime");tcp::socket socket(io_context);asio::connect(socket, endpoints);for (;;){boost::array buf;asio::error_code error;size_t len = socket.read_some(asio::buffer(buf), error);if (error == asio::error::eof)break; // Connection closed cleanly by peer.else if (error)throw asio::system_error(error); // Some other error.std::cout.write(buf.data(), len);}}catch (std::exception& e){std::cerr << e.what() << std::endl;}return 0;
}

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...