boost::asio编程-同步TCP
boost.asio库是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型。
boost.asio库支持TCP、UDP、ICMP通信协议。
下面介绍同步TCP模式:
大家好!我是同步方式!
我的主要特点就是执着!所有的操作都要完成或出错才会返回,不过偶的执着被大家称之为阻塞,实在是郁闷~~(场下一片嘘声),其实这样 也是有好处的,比如逻辑清晰,编程比较容易。
在服务器端,我会做个socket交给acceptor对象,让它一直等客户端连进来,连上以后再通过这个socket与客户端通信, 而所有的通信都是以阻塞方式进行的,读完或写完才会返回。
在客户端也一样,这时我会拿着socket去连接服务器,当然也是连上或出错了才返回,最后也是以阻塞的方式和服务器通信。
有人认为同步方式没有异步方式高效,其实这是片面的理解。在单线程的情况下可能确实如此,我不能利用耗时的网络操作这段时间做别的事 情,不是好的统筹方法。不过这个问题可以通过多线程来避免,比如在服务器端让其中一个线程负责等待客户端连接,连接进来后把socket交给另外的线程去 和客户端通信,这样与一个客户端通信的同时也能接受其它客户端的连接,主线程也完全被解放了出来。
我的介绍就有这里,谢谢大家!
同步方式示例代码:
服务器端
// BoostTcpServer.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include "boost/asio.hpp"
#include "boost/thread.hpp"using namespace std;
using namespace boost::asio;#ifdef _MSC_VER
#define _WIN32_WINNT 0X0501 //避免VC下编译警告
#endif#define PORT 1000
#define IPV6
//#define IPV4int _tmain(int argc, _TCHAR* argv[])
{// 所有asio类都需要io_service对象io_service iosev;//创建用于接收客户端连接的acceptor对象
#ifdef IPV4ip::tcp::acceptor acceptor(iosev,ip::tcp::endpoint(ip::tcp::v4(), PORT));
#endif#ifdef IPV6ip::tcp::acceptor acceptor(iosev,ip::tcp::endpoint(ip::tcp::v6(), PORT));
#endifwhile (true){// socket对象ip::tcp::socket socket(iosev);// 等待直到客户端连接进来acceptor.accept(socket);// 显示连接进来的客户端std::cout <<"remote ip:"<<socket.remote_endpoint().address()<<endl;std::cout <<"remote port:"<<socket.remote_endpoint().port() << std::endl;char buf[2048];boost::system::error_code ec;while(1){socket.read_some(buffer(buf),ec);if (ec){std::cout <<boost::system::system_error(ec).what() << std::endl;break ;}std::cout<<"recv msg:"<<buf<<endl;if(strcmp(buf,"bye")==0)//收到结束消息结束客户端连接{break;}socket.write_some(buffer("I heared you!\n"),ec);if (ec){std::cout <<boost::system::system_error(ec).what() << std::endl;break ;}}socket.close();// 与当前客户交互完成后循环继续等待下一客户连接}return 0;
}
客户端
// BoostTcpClient.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include "boost/asio.hpp"using namespace boost::asio;#ifdef _MSC_VER
#define _WIN32_WINNT 0X0501 //避免VC下编译警告
#endif#define PORT 1000
#define IPV6
//#define IPV4int _tmain(int argc, _TCHAR* argv[])
{// 所有asio类都需要io_service对象io_service iosev;// socket对象ip::tcp::socket socket(iosev);// 连接端点,这里使用了本机连接,可以修改IP地址测试远程连接
#ifdef IPV4ip::address_v4 address=ip::address_v4::from_string("127.0.0.1");
#endif#ifdef IPV6//"0:0:0:0:0:0:0:1"为IPV6的本机回环地址,类似于"127.0.0.1"ip::address_v6 address=ip::address_v6::from_string("0:0:0:0:0:0:0:1");
#endifip::tcp::endpoint ep(address, PORT);// 连接服务器boost::system::error_code ec;socket.connect(ep,ec);// 如果出错,打印出错信息if (ec){std::cout << boost::system::system_error(ec).what() << std::endl;return -1;}//循环发送和接收数据for(int i=0;i<5;++i){//发送数据socket.write_some(buffer("hello"), ec);// 接收数据char buf[100];size_t len=socket.read_some(buffer(buf), ec);std::cout.write(buf, len);Sleep(500);}//发送与服务端约定好的结束语,由服务端断链socket.write_some(buffer("bye"), ec);getchar();return 0;
}
代码中兼容了IPV4和IPV6两种IP协议,使用宏定义选择使用哪种IP协议,当然客户端和服务端的协议必须一致才能正常通信。
boost::asio编程-同步TCP相关推荐
- c++语言 tcp例子,C++ boost::asio编程-同步TCP详解及实例代码
boost::asio编程-同步TCP boost.asio库是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型. boost.asio库支持TCP.UDP.IC ...
- Boost:基于boost::asio的延迟tcp服务器测试程序
Boost:基于boost::asio的延迟tcp服务器测试程序 实现功能 C++实现代码 客户端源码 服务端源码 实现功能 boost::asio模块,基于boost::asio的延迟tcp服务器测 ...
- 基于boost asio实现sync tcp server通信
文章目录 一.功能介绍 二.string类型数据交互 2.1 程序源码 2.2 编译&&执行 2.3 程序执行结果 三.byte类型数据交互 3.1 程序源码 3.2 编译&& ...
- boost asio 异步实现tcp通讯
一.前言 boost asio可算是一个简单易用,功能又强大可跨平台的C++通讯库,效率也表现的不错,linux环境是epoll实现的,而windows环境是iocp实现的.而tcp通讯是项目当中经常 ...
- boost.asio异步并发Tcp服务器
简介 boost的asio采用的是Proactor模型,该模型的核心思想就是异步IO,IO在事件循环中,每个异步IO都绑定对应的回调函数,当IO完成后,对应的回调函数会在事件循环中执行. 异步并发模型 ...
- boost asio 文件服务器,使用boost ASIO库封装TCP服务器类
使用异步TCP方式,可在此基础上增加更多功能. 头文件AsioTcp.h: #pragma once #include #include #include typedef boost::asio::i ...
- boost.asio系列——socket编程
asio的主要用途还是用于socket编程,本文就以一个tcp的daytimer服务为例简单的演示一下如何实现同步和异步的tcp socket编程. 客户端 客户端的代码如下: #include &l ...
- Boost asio学习笔记之二—— 网络编程
boost库中的网络编程的例子比较复杂,不太好理解,所以,从网上找了一个简单点的例子.网址如下:http://blog.chinaunix.net/u3/93184/showart_1846119.h ...
- Boost.Asio入门
原文地址:https://mmoaay.gitbooks.io/boost-asio-cpp-network-programming-chinese/content/Chapter1.html Boo ...
最新文章
- oracle convertobject,oracle.sql進行轉換。TIMESTAMPLTZ@71d9d55b Java時間戳
- $.fn.zTree 展开 回显 选中
- asp.net如何生成图片验证码
- addr2line探秘
- java keytool详解
- 为何 linux 要用 tar.gz,而不用 7z 或 zip?
- 使用Xftp连接Linux
- 复试21天Day 20
- UE4 HUD相关的笔记
- Linksys WRT1900ACS 路由器恢复原厂固件
- Word表格外的第一个空行如何删除
- Bus Video System CodeForces - 978E(思维)
- 试用mmdetection
- jenkins创建新用户_Jenkins凭据管理
- 逃离烤鸭味的雾霾北京,我们还能去哪里?
- C语言正数和负数循环右移,左移,把某正数的第m位(从0开始)到n位取反
- oracle pl/sql level妙用
- js对JSON的操作
- 使用Canvas画布实现简单的计时器功能
- There are test failures.【非常详细,已解决】