VS2022通过C++网络库Boost.Asio创建一个简单的同步TCP服务器和客户端

Boost.Asio是一个用于网络和异步编程的C++库。它提供了一种跨平台的方式来处理网络编程和异步操作,使开发人员能够创建高性能的网络应用程序,asio几乎支持所有你能够想到的网络协议,比如tcp、udp、ip、http、icmp等,C++通过asio库可以轻松实现tcp和http服务器。(本博客默认你已经安装好了boost库,并且博主的boost库版本是1.84.0,集成环境是VS2022)。

第一步配置boost库的开发环境,相比于其他库,VS2022配置boost库的开发环境比较简单,只需要包含头文件和静态链接库就可以了。

首先创建两个C++控制台项目,BoostClient和BoostServer。

打开BoostClient的属性,包含boost的头文件目录和静态链接库目录就可以了。

首先是服务器端的代码。

#include <iostream>
#include<boost/asio.hpp>
#include<string>
int main()
{
    int port = 3333;
    std::string saddr = "127.0.0.1";
    boost::asio::ip::address addr = boost::asio::ip::address::from_string(saddr);
    boost::asio::io_context ioc;
    boost::asio::ip::tcp::endpoint ep(addr, port);
    boost::asio::ip::tcp::acceptor ac(ioc, ep);
    while (true)
    {
        boost::asio::ip::tcp::socket soc(ioc);//创建套接字必须使用上下文
        ac.accept(soc);
        char request[100] = "";
        soc.receive(boost::asio::buffer(request, 100));
        std::cout << "成功接收到了客户端的消息:" << request<<std::endl;
        std::string reply = "你好客户端,服务器成功接收到了你的消息";
        soc.send(boost::asio::buffer(reply, reply.size()));
        soc.close();
    }
    return 0;
}

同步类型的TCP服务器搭建起来相对简单,首先创建一个上下文对象ioc,然后再创建一个端点对象ep,再创建一个监听套接字对象ac,创建套接字对象必须要借助上下文对象,这是必须的,至于端点对象,你可以直接将它传入acceptor的构造函数中,这样就省略了绑定这一操作了,否则,你需要在创建完ac之后再调用bind函数,将ac和ep进行绑定。(其实acceptor就是一个特殊的套接字对象,本质就是套接字)。

ac.bind(ep);

然后就是接收客户端的响应了,可以使用receive函数也可以使用read_some函数,发送响应就使用send函数或者write_some函数。

接着就是客户端代码。

#include <iostream>
#include<boost/asio.hpp>
int main()
{
	boost::asio::io_context ioc;
	boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"), 3333);
	boost::asio::ip::tcp::socket soc(ioc);
	soc.connect(ep);
	char request[100] = "";
	std::cin >> request;
	soc.send(boost::asio::buffer(request, 100));
	char rce[100] = "";
	soc.receive(boost::asio::buffer(rce, 100));
	std::cout << "成功收到了消息:" << rce<<std::endl;
	char reply[100] = { "你好服务器,这里是客户端,我们成功收到了消息" };
	soc.send(boost::asio::buffer(reply, 300));
}

同样地要先创建上下文,因为创建套接字必须使用上下文对象,然后创建端点对象,并把套接字对象连接到对应的端点进程,这样客户端和服务器端就成功连接了,之后用send和recevie函数进行数据读写就可以了。

运行代码,首先运行服务器的代码。

再运行两次客户端代码,依次输入1和2,注意先不要回车

输入2后进行回车,发现没有响应,是因为1先连接到了服务器,将线程阻塞了,必须执行完1的程序才会执行2的程序。

再对1进行回车,发现两个程序都成功执行了。

服务器端也成功接收到了消息。

注意点:使用char数组来接收客户端发送的消息的主要原因是,Boost.Asio的读取操作需要一个可变的缓冲区,而char数组提供了这样的缓冲区。Boost.Asio的读取操作函数,如read_some()和receive,需要一个可变的缓冲区作为参数,用于存储从套接字接收的数据。char数组是一种连续的内存块,可以用于存储二进制数据,因此在这种情况下非常适合作为缓冲区。另一方面,std::string是一个动态大小的字符序列,它可以自动调整大小以适应不同长度的字符串。虽然std::string也提供了访问底层字符数组的方法(如`c_str()`和`data()`),但它并不是一个可变的缓冲区,而是一个字符串容器,所以在接收请求的时候更加推荐使用char类型的字符串,并且所有字符串都要初始化为空,不然会中文乱码。

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于boost.asio高性能并发c++ tcp网络 C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的。C++C语言的扩展,旨在提供更强大的编程能力,包括面向对象编程和泛型编程的支持。C++支持数据封装、继承和多态等面向对象编程的特性和泛型编程的模板,以及丰富的标准,提供了大量的数据结构和算法,极大地提高了开发效率。12 C++是一种静态类型的、编译式的、通用的、大小写敏感的编程语言,它综合了高级语言和低级语言的特点。C++的语法与C语言非常相似,但增加了许多面向对象编程的特性,如类、对象、封装、继承和多态等。这使得C++既保持了C语言的低级特性,如直接访问硬件的能力,又提供了高级语言的特性,如数据封装和代码重用。13 C++的应用领域非常广泛,包括但不限于教育、系统开发、游戏开发、嵌入式系统、工业和商业应用、科研和高性能计算等领域。在教育领域,C++因其结构化和面向对象的特性,常被选为计算机科学和工程专业的入门编程语言。在系统开发领域,C++因其高效性和灵活性,经常被作为开发语言。游戏开发领域中,C++由于其高效性和广泛应用,在开发高性能游戏和游戏引擎中扮演着重要角色。在嵌入式系统领域,C++的高效和灵活性使其成为理想选择。此外,C++还广泛应用于桌面应用、Web浏览器、操作系统、编译器、媒体应用程序、数据引擎、医疗工程和机器人等领域。16 学习C++的关键是理解其核心概念和编程风格,而不是过于深入技术细节。C++支持多种编程风格,每种风格都能有效地保证运行时间效率和空间效率。因此,无论是初学者还是经验丰富的程序员,都可以通过C++来设计和实现新系统或维护旧系统。3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咩咩大主教

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值