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相关推荐

  1. c++语言 tcp例子,C++ boost::asio编程-同步TCP详解及实例代码

    boost::asio编程-同步TCP boost.asio库是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型. boost.asio库支持TCP.UDP.IC ...

  2. Boost:基于boost::asio的延迟tcp服务器测试程序

    Boost:基于boost::asio的延迟tcp服务器测试程序 实现功能 C++实现代码 客户端源码 服务端源码 实现功能 boost::asio模块,基于boost::asio的延迟tcp服务器测 ...

  3. 基于boost asio实现sync tcp server通信

    文章目录 一.功能介绍 二.string类型数据交互 2.1 程序源码 2.2 编译&&执行 2.3 程序执行结果 三.byte类型数据交互 3.1 程序源码 3.2 编译&& ...

  4. boost asio 异步实现tcp通讯

    一.前言 boost asio可算是一个简单易用,功能又强大可跨平台的C++通讯库,效率也表现的不错,linux环境是epoll实现的,而windows环境是iocp实现的.而tcp通讯是项目当中经常 ...

  5. boost.asio异步并发Tcp服务器

    简介 boost的asio采用的是Proactor模型,该模型的核心思想就是异步IO,IO在事件循环中,每个异步IO都绑定对应的回调函数,当IO完成后,对应的回调函数会在事件循环中执行. 异步并发模型 ...

  6. boost asio 文件服务器,使用boost ASIO库封装TCP服务器类

    使用异步TCP方式,可在此基础上增加更多功能. 头文件AsioTcp.h: #pragma once #include #include #include typedef boost::asio::i ...

  7. boost.asio系列——socket编程

    asio的主要用途还是用于socket编程,本文就以一个tcp的daytimer服务为例简单的演示一下如何实现同步和异步的tcp socket编程. 客户端 客户端的代码如下: #include &l ...

  8. Boost asio学习笔记之二—— 网络编程

    boost库中的网络编程的例子比较复杂,不太好理解,所以,从网上找了一个简单点的例子.网址如下:http://blog.chinaunix.net/u3/93184/showart_1846119.h ...

  9. Boost.Asio入门

    原文地址:https://mmoaay.gitbooks.io/boost-asio-cpp-network-programming-chinese/content/Chapter1.html Boo ...

最新文章

  1. oracle convertobject,oracle.sql進行轉換。TIMESTAMPLTZ@71d9d55b Java時間戳
  2. $.fn.zTree 展开 回显 选中
  3. asp.net如何生成图片验证码
  4. addr2line探秘
  5. java keytool详解
  6. 为何 linux 要用 tar.gz,而不用 7z 或 zip?
  7. 使用Xftp连接Linux
  8. 复试21天Day 20
  9. UE4 HUD相关的笔记
  10. Linksys WRT1900ACS 路由器恢复原厂固件
  11. Word表格外的第一个空行如何删除
  12. Bus Video System CodeForces - 978E(思维)
  13. 试用mmdetection
  14. jenkins创建新用户_Jenkins凭据管理
  15. 逃离烤鸭味的雾霾北京,我们还能去哪里?
  16. C语言正数和负数循环右移,左移,把某正数的第m位(从0开始)到n位取反
  17. oracle pl/sql level妙用
  18. js对JSON的操作
  19. 使用Canvas画布实现简单的计时器功能
  20. There are test failures.【非常详细,已解决】

热门文章

  1. 【日语】日语商务情景口语
  2. 漏刻有时数据可视化大屏数据可视化动态模拟演示与自动轮播
  3. 6-1 数一数每个数据出现多少次,挑出出现次数最多的那一个
  4. python, echarts 实现世界地图地域流向地图
  5. cos47度怎么用计算机算,cos47度等于多少
  6. python读取svg_使用Python / PIL读取SVG文件
  7. 短信验证码的发展和原理
  8. Davinci数据可视化-新增图表类型-旭日图
  9. 广东某银行基于阿凡搭在信创环境下打造全行科技一体化服务平台
  10. 从零开始用C语言实现图片解码播放器(有源码)