C++ boost::asio编程-同步TCP详解及实例代码

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 IPV4 

int _tmain(int argc, _TCHAR* argv[])
{
  // 所有asio类都需要io_service对象
  io_service iosev; 

  //创建用于接收客户端连接的acceptor对象
#ifdef IPV4
  ip::tcp::acceptor acceptor(iosev,ip::tcp::endpoint(ip::tcp::v4(), PORT));
#endif 

#ifdef IPV6
  ip::tcp::acceptor acceptor(iosev,ip::tcp::endpoint(ip::tcp::v6(), PORT));
#endif 

  while (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 IPV4 

int _tmain(int argc, _TCHAR* argv[])
{
  // 所有asio类都需要io_service对象
  io_service iosev;
  // socket对象
  ip::tcp::socket socket(iosev); 

  // 连接端点,这里使用了本机连接,可以修改IP地址测试远程连接
#ifdef IPV4
  ip::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");
#endif
  ip::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协议,当然客户端和服务端的协议必须一致才能正常通信。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • C++之BOOST字符串查找示例

    本文实例讲述了C++中BOOST字符串查找的方法,分享给大家供大家参考.具体方法如下: BOOST  字符串查找示例 复制代码 代码如下: #include <string>  #include <iostream>  #include <algorithm>  #include <functional>  #include <boost/algorithm/string/case_conv.hpp>  #include <boost/al

  • 使用设计模式中的单例模式来实现C++的boost库

    线程安全的单例模式 一.懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例. 需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety. 使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈. 1.静态成员实例的懒汉模式: class Singleton { private: static Singleton* m_instance; Sing

  • C++ boost::asio编程-域名解析详细介绍

    C++ boost::asio编程-域名解析 在网络通信中通常我们并不直接使用IP地址,而是使用域名.这时候我们就需要用reslover类来通过域名获取IP,它可以实现 与IP版本无关的网址解析. #include "stdafx.h" #include "boost/asio.hpp" #include "boost/shared_ptr.hpp" #include "boost/thread.hpp" #include &

  • 使用boost读取XML文件详细介绍

    boost读取XML文件 boost中提供了对配置文件读取的支持,它就是:property_tree. basic_ptree 是property_tree的核心基础.其接口像std::list.可以执行很多基本的元素操作,比如使用begin().end()等.     此外还加入了操作属性树的get().get_child().get_value().data()等额外的操作. basic_ptree有两个重要的内部定义self_type和value_type.self_type是basic_

  • visual studio 2015下boost库配置教程

    因为我也是第一尝试配置,所以有很多不懂得地方,上网找的教程又很多都是老版本的VS,比如VS2010 VS2012又或者Boost1.54之类的. **我根据自己的配置情况给大家一个建议.** 仅给有需要的人以参考用,如有不合适的地方,敬请纠正 首先,我们需要下载一个Boost库. 这个直接去他的官网下就可以了:boost下载地址 下载好后解压到一个目录里.比如我解压到D盘根目录 然后我们打开[开始菜单]->[找到你对应版本的vs命令窗口,比如我是vs2015的]P.s:一定要对应自己的VS版本

  • VS2013安装配置和使用Boost库教程

    一.前言 好好研究下大名鼎鼎的Boost库. 二.Boost安装 2.1Boost官网下载Boost最新版Version 1.55.0 2.2将下载压缩包解压到本地 解压后可看到目录下有个bootstrap.bat文件. 2.3打开cmd命令窗体,执行bootstra.bat文件 运行下面命令,详细依据自己的环境略有变化. 最基本的目的是我们要执行bootstrap.bat文件 运行完后,结果例如以下: 然后在目录下我们会发现新生成了一个名为bjam.exe的文件 2.4在cmd窗体中执行bja

  • C++中Boost库裁剪与其应用详解

    前言 Boost 库涵盖的范围极广,有字符串和文本处理相关子库比如 format 库和 regexp 库,有容器相关子库比如 variant 库(和 Qt 的 QVariant 有得一拼),有迭代器子库比如 tokenizer 库(可以把字符进行 tokenize),还有算法.函数对象和高阶编程相关子库如functional 库.lambda 库和 signal 库,还有泛型编程.模板编程子库如 call traits.mpl,还有并发编程相关的 thread 库,等等等等. Boost 是如此

  • C++之boost::array的用法

    本文实例讲述了C++之boost::array的用法,分享给大家供大家参考.具体如下: 复制代码 代码如下: #include <string>  #include <iostream>  #include <boost/array.hpp>  #include <algorithm>  using namespace std;  int main()  {      boost::array<int, 5> array_temp = {{12,

  • C++之Boost::array用法简介

    本文实例讲述了c++里支持静态数组的容器:boost.array.分享给大家供大家参考.具体分析如下: 很多C++程序员都认为boost.array很有可能出现在下一代标准库里.对于boost.array的用法有一个基本的了解是很有必要的. 1. 为什么我们需要固定大小的数组的容器 首先,固定大小的数组还是很常见的,虽然stl提供了vector,但是vector作为动态可增长的数组,比静态数组多了一点开销,这在一些人看来是无法忍受的.c++里也需要提供固定大小容量的数组容器,当然,性能可以和普通

  • 浅析Boost智能指针:scoped_ptr shared_ptr weak_ptr

    一. scoped_ptrboost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放.下列代码演示了该指针的基本应用: 复制代码 代码如下: #include <string>#include <iostream>#include <boost/scoped_ptr.hpp> class implementation{public:    ~implementation() { std::cout

随机推荐