开源项目(库)之boost::asio学习(一)
来源:互联网 发布:java面试造假 编辑:程序博客网 时间:2024/06/05 05:46
boost::asio库是一个很牛逼的库,想必接触过boost::asio开发过的人都应该有这种感觉,前段时间在项目中使用了下boost::asio库,给我的第一感觉就是boost::asio封装已到达如此的地步,于是勾起了我想要深入学习boost::asio库的冲动,好了,总结下之前在项目中使用boost::asio的一些案例,这些案例也是上网看到的,但是之后的一些编程实例,都是在这些案例上不断修改完善而得到的,先来看几个比较基础的代码吧
1)同步的boost::asio
服务器端代码
#include <iostream>#include <boost/asio.hpp>int main(int argc,char* argv[]){ using namespace boost::asio; io_service iosev; ip::tcp::acceptor acceptor(iosev,ip::tcp::endpoint(ip::tcp::v4(),9999)); for(;;) { ip::tcp::socket socket(iosev); acceptor.accept(socket); std::cout<<socket.remote_endpoint().address()<< std::endl; boost::system::error_code ecode; socket.write_some(buffer("my name is zmyer"),ecode); if(ecode) { std::cout<<boost::system::system_error(ecode).what()<<std::endl; break; } } return 0;}
客户端代码:
#include<iostream>#include<boost/asio.hpp>int main(int argc,char*argv[]){ using namespace boost::asio; io_service ioserv; ip::tcp::socket socket(ioserv); ip::tcp::endpoint epoint(ip::address_v4::from_string("127.0.0.1"),9999); boost::system::error_code ecode; socket.connect(epoint,ecode); if(ecode) { std::cout<<boost::system::system_error(ecode).what()<<std::endl; return -1; }#define MAX_BUFFERSIZE 1024 char buff[MAX_BUFFERSIZE]; bzero(buff,sizeof(buff)); size_t len = socket.read_some(buffer(buff),ecode); std::cout.write(buff,len); std::cout.write("\n",1); return 0;}上述代码很简单,下面我们就将这个案例修改为一个简单版的回显服务器吧,代码如下:
服务器端代码:
#include <iostream>#include <unistd.h>#include <boost/asio.hpp>int main(int argc,char* argv[]){ using namespace boost::asio; io_service iosev; ip::tcp::acceptor acceptor(iosev,ip::tcp::endpoint(ip::tcp::v4(),9999)); for(;;) { pid_t forkid; ip::tcp::socket socket(iosev); acceptor.accept(socket); std::cout<<socket.remote_endpoint().address()<< std::endl; forkid = fork(); if(forkid == -1) break; else if(forkid ==0) { for(;;) { boost::system::error_code ecode;#define MAX_BUFFERSIZE 1024 char buff[MAX_BUFFERSIZE]; bzero(buff,sizeof(buff)); size_t len = socket.read_some(buffer(buff),ecode); if(ecode) { std::cout<<boost::system::system_error(ecode).what()<<std::endl; break; } std::cout.write(buff,len); std::cout.write("\n",1); socket.write_some(buffer(buff),ecode); if(ecode) { std::cout<<boost::system::system_error(ecode).what()<<std::endl; break; } } } } return 0;}
客户端代码:
#include<iostream>#include<boost/asio.hpp>int main(int argc,char*argv[]){ using namespace boost::asio; io_service ioserv; ip::tcp::socket socket(ioserv); ip::tcp::endpoint epoint(ip::address_v4::from_string("127.0.0.1"),9999); boost::system::error_code ecode; socket.connect(epoint,ecode); if(ecode) { std::cout<<boost::system::system_error(ecode).what()<<std::endl; return -1; }#define MAX_BUFFERSIZE 1024 char buff[MAX_BUFFERSIZE]; bzero(buff,sizeof(buff)); while(1) { std::cin.getline(buff,sizeof(buff)); socket.write_some(buffer(buff),ecode); bzero(buff,sizeof(buff)); size_t len = socket.read_some(buffer(buff),ecode); std::cout.write(buff,len); std::cout.write("\n",1); } return 0;}
这个回显服务器写的比较的简单,里面使用了子进程,也许你会感到很疑惑,父进程和子进程共用了一个socket接口。其实在fork完之后,在子进程的文件描述符表里面就已经有socket的副本了,好好地体会吧。
总结
本篇博文主要是针对boost::asio库的同步机制写了几个简单点的程序,从这些程序中,我们可以初步了解boost::asio接口的一些基本用法,原本打算将上述的代码改进成聊天室,但是发现在实现中遇到了一个boost::asio库的底层问题,目前还在解决中,暂且不贴这部分代码,好了,这篇博文主要是一个开场,在后续的博文中,我们会陆续学习一些boost::asio库,好了,本篇博文到此结束。
如果需要,请注明转载,多谢
3 0
- [Boost.asio] 开源项目(库)之boost:asio学习(1)
- 开源项目(库)之boost::asio学习(一)
- 开源项目(库)之boost::asio学习(二)
- boost::asio学习之[一]
- Boost Asio库的学习与探究(一)
- Boost.Asio翻译(一)
- Boost.Asio翻译(一)
- Boost.Asio基础(一)
- boost asio学习(1)
- boost asio学习(2)
- 一步一步学习 Boost 之 Asio
- Boost.Asio学习之Tutorial
- Boost.Asio学习之Allocation
- Boost.Asio学习之Buffer
- Boost.Asio学习之总结
- Boost::asio库的网络编程学习(转)
- Boost Asio库的学习与探究(二)
- Boost Asio库的学习与探究(三)
- hdu4396 多状态spfa
- Construct Binary Tree from Preorder and Inorder Traversal
- ubuntu apache 服务器 文件下载
- MSTP域
- BAT 批处理脚本 教程
- 开源项目(库)之boost::asio学习(一)
- 使用位运算计算加减乘除四则运算
- hdu 4539 状态压缩DP
- linux进程组、会话和守护进程
- td内容较多,造成table变形
- System.exit(0)和System.exit(1)+return
- win7 喇叭图标不见了
- Tomcat总是自动跳debug模式解决方法
- JavaScript忍者的秘密--第一部分--准备训练