首页 > 技术文章 > boost::asio::ip::tcp中几个重要类型

Focus-Flying 2018-07-22 11:21 原文

  • typedef basic_stream_socket socket;

流式套接字,提供同/异步发送接收数据,连接,绑定,设置套接字选项等功能
对于socket中的connect()方法,它只针对某一个 endpoint 的连接

  • typedef basic_socket_acceptor acceptor;

用于服务器端接受新连接的套接字,此类中的accept()方法调用后,将阻塞直到有客户端连接或产生错误


void doit(socket_type s)
{
	// .......
}


namespace asio = boost::asio;

typedef shared_ptr<asio::ip::tcp::socket> socket_type;

asio::ip::tcp::endpoint server_endpoint(asio::ip::tcp::v4(), server_port);
asio::ip::tcp::acceptor acceptor(io_context, server_endpoint);
for ( ; ; )
{
	socket_type socket(new asio::ip::tcp::socket(io_context));
	acceptor.accept(*socket);

	boost::thread(boost::bind(doit, socket));
}
  • typedef basic_resolver resolver;

  • typedef basic_resolver_results results_type;

提供了将查询解析为端点列表的能力, 调用类中的 resolve()方法将得到某个服务器所有可用的ip,并将结果以results_type类型返回。我们可以以resolve()返回的结果集为参数调用boost::asio::connect()方法去连接服务器,boost::asio::connect()方法将逐个尝试连接知道成功连接或产生错误。

namespace asio = boost::asio;

asio::io_context io_context;
asio::ip::tcp::socket s(io_context);
asio::ip::tcp::resolver resolver(io_context);
asio::ip::tcp::resolver::results_type peer_endpoints = 
		resolver.resolve("www.baidu.com", "http");
asio::connect(s, peer_endpoints);

// 和linux中的getaddrinfo函数相同

推荐阅读