boost::asio网络编程


完整示例代码
在这里插入图片描述

booast::asio和boost::asio::ip
boost::asio提供了同步和异步的connect、read、write函数。这些函数有2套实现,一个是出错时抛异常,一个是传入错误码
boost::asio::ip提供了对ip地址、端点的封装,当创建套接字时需要传入io_context,并提供了套接字属性控制函数(类似fcntl)
cmake构建时需要的组件 boost::system boost::regex

基础操作

端点的生成

int client_end_point() {
   
	//1.对端ip string转address
	std::string raw_ip_address = "127.4.8.1";
	unsigned short port_num = 3333;
	boost::system::error_code ec;
	asio::ip::address ip_address = asio::ip::address::from_string(raw_ip_address, ec);
	if (ec.value() != 0)//转换失败
	{
   
		std::cout << "解析ip失败 " << ec.message() << std::endl;
		return ec.value();
	}
	//2. 生成端点
	asio::ip::tcp::endpoint ep(ip_address, port_num);
	return 0;
}

int  server_end_point() {
   
	unsigned short port_num = 3333;
	asio::ip::address ip_address = asio::ip::address_v6::any();
	asio::ip::tcp::endpoint ep(ip_address, port_num);
	return 0;
}

创建socket

传入 上下文asio::io_context,使socket能够注册自己的事件,在事件循环中得到处理

asio::io_context ioc;
asio::ip::tcp protocol = asio::ip::tcp::v4();
asio::ip::tcp::socket sock(ioc);

服务端创建acceptor用于监听传入的连接请求 并 接受连接

和创建socket一样,老版本需要手动调用open打开一下:acceptor.open(protocol, ec)。

asio::io_context ios;
asio::ip::tcp::acceptor acceptor(ios);

服务器绑定端口

如下写法相当于执行了bind:服务器端 3333端口 接收ipv4连接

asio::io_context ios;
asio::ip::tcp::endpoint ep(asio::ip::tcp::v4(), 3333);
asio::ip::tcp::acceptor acceptor(ios, ep);

旧版写法如下

//1.创建端点
unsigned short port_num = 3333;
asio::ip::tcp::endpoint ep(asio::ip::address_v4::any(), port_num);
//2.创建acceptor
asio::io_context ios;
asio::ip::tcp::acceptor acceptor(ios, ep.protocol());
//3.bind
boost::system::error_code ec;
acceptor.bind(ep, ec);

异步的accept:acceptor.async_accept(error_code)

客户端通过ip连接服务端 connect

int connect_to_end()
{
   
	//服务器的ip和端口
	std::string raw_ip_address = "192.168.1.124";
	unsigned short port_num = 3333;
	try
	{
   
		//1.创建socket
		asio::ip::tcp::endpoint ep(asio::ip::address::from_string(raw_ip_address), port_num);
		asio::io_context ios;
		asio::ip::tcp::socket sock(ios, ep.protocol());//ep.protocol()就是ipv4
		//2.连接到端点
		sock.connect(ep);
	}
	catch (boost::system::system_error& e)
	{
   
		std::cout << e.what() << std::endl;
	}
	return 0;
}

客户端通过域名连接服务端

int dns_connect_to_end()
{
   
	std::string host = "samplehost";//域名
	std::string port_num = "3333";
	//1.创建dns解析器
	asio
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值