asio学习笔记4

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;
}

运行结果:
20140218104026.jpg

这里的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不需要我多说,前面已经说过了。

这篇笔记就到此为止了,感觉有点短,过会再写一篇。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值