asio学习笔记4
今天来写一下同步的发起连接和发送数据的相关的函数,很简单。昨天有童鞋说写同步的不爽,不过我觉得asio的同步的函数和异步的用法参数都很像,只是思想不同,最开始已经把异步的思想都说明了,再明白了网络操作的函数的用法,那异步的网络通信不也是水到渠成了吗?
废话不多说,继续上代码:
#include <boost/asio.hpp>
#include <iostream>
#include <string>
int main(int argc, char* argv[])
{
boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(boost::asio::ip::tcp::v4(), "127.0.0.1", "1234");
boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
boost::asio::ip::tcp::socket sock(io_service);
boost::asio::connect(sock, iterator);
for (;;)
{
std::string line;
getline(std::cin, line);
boost::asio::write(sock, boost::asio::buffer(line.c_str(), line.size()+1));
char reply[1024];
boost::asio::read(sock, boost::asio::buffer(reply, line.size() + 1));
std::cout << reply << std::endl;
}
return 0;
}
运行结果:
这里的boost::asio::ip::tcp::resolver就是前一篇文章说的其他的创建endpoint进行连接的方法,要说这个resolver跟跟直接创建endpoint的区别,个人感觉是resolver更方便一些,不但能解析IP地址的字符串,还能根据服务名解析出相应的端口,并且有的函数的参数只能是resolve返回的iterator。其实这个类就是对getaddrinfo这个socket函数的一个封装,想要详细了解的童鞋可以去看看unix网络编程。resolve返回的是一个iterator,原因是写的是主机名的话可能返回的IP地址不止一个,但是绝大多数时候我们都是写的IP地址,所以只取第一个iterator就行了;iterator->endpoint()则可以方便的获取这个iterator对应的endpoint。
有了endpoint之后,我们就可以连接这个endpoint了,connect是一个单独的函数,可能是因为功能比较单一就没有封装成类。boost::asio::connect需要的是一个resolver返回的iterator而不是一个endpoint,这点我也比较奇怪;然后是一个boost::asio::ip::tcp::socket,连接成功后这个就是连接的socket句柄。
下面的read write不需要我多说,前面已经说过了。
这篇笔记就到此为止了,感觉有点短,过会再写一篇。