目录
完整示例代码

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