(点击上方公众号,可快速关注)
完整的网络通信涉及到IO操作,而IO操作在Asio中是一个大头,后面会花大篇章介绍。这篇主要呈现在Asio下,简单的客户端的代码结构是什么样的,毕竟准备内容也这么多了。还是之前提到的,Asio网络通信【主要是同步模式】跟socket编程非常相似,甚至函数名都相似。
UDP客户端
#include <boost/asio.hpp>
#include <iostream>
using namespace boost;
int main()
{
// 指定服务器的IP和端口
std::string raw_ip_address = "127.0.0.1";
unsigned short port_num = 3333;
try {
// 创建端点
asio::ip::udp::endpoint
ep(asio::ip::make_address(raw_ip_address),
port_num);
// 创建主动socket
asio::io_context ioc;
asio::ip::udp::socket sock(ioc, ep.protocol());
// 给服务器发送消息
// 接收服务器的返回
// 处理服务器的返回
}
catch (system::system_error &e) {
std::cout << "Error occured! Error code = " << e.code()
<< ". Message: " << e.what();
return e.code().value();
}
return 0;
}
简单的UDP客户端的主要流程包含以上几步:
指定服务器的IP和端口、创建端点、创建主动socket
这几部分已经做了介绍。
给服务器发送消息、接收服务器的返回
需要使用一些IO函数,类似于socket编程中的
send
、sendto
、recv
、recvfrom
等函数。处理服务器的返回
跟具体的需求相关,如,echo、time等客户端仅仅是将服务器的返回展示到终端,而现实中的业务逻辑则可能比较复杂。
TCP客户端
TCP与UDP最大的不同,TCP是面向连接的,在通信之前要专门建立两个通信节点之间的通道,在socket中我们使用connect
函数:
#include <sys/socket.h>
int connect(int socket, const struct sockaddr *address,
socklen_t address_len);
在Asio中的函数名也是connect
,使用起来也很方便。
// 抛异常
void connect(const endpoint_type & peer_endpoint);
// 不抛异常
void connect(const endpoint_type & peer_endpoint,
boost::system::error_code & ec);
代码跟UDP类似,只是多了建虚拟连接的过程。
#include <boost/asio.hpp>
#include <iostream>
using namespace boost;
int main()
{
// 指定服务器的IP和端口
std::string raw_ip_address = "127.0.0.1";
unsigned short port_num = 3333;
try {
// 创建端点
asio::ip::tcp::endpoint
ep(asio::ip::make_address(raw_ip_address),
port_num);
// 创建主动socket
asio::io_context ioc;
asio::ip::tcp::socket sock(ioc, ep.protocol());
// 建立虚拟连接
sock.connect(ep);
// 给服务器发送消息
// 接收服务器的返回
// 处理服务器的返回
}
catch (system::system_error &e) {
std::cout << "Error occured! Error code = " << e.code()
<< ". Message: " << e.what();
return e.code().value();
}
return 0;
}
喜欢我的文章,请关注我的公众号。