boost.asio系列——socket编程

asio的主要用途还是用于socket编程,本文就以一个tcp的daytimer服务为例简单的演示一下如何实现同步和异步的tcp socket编程。

客户端

客户端的代码如下:

#include

#include

#include



usingboost::asio::ip::tcp;



intmain(intargc,char*argv[])

{

try

{

boost::asio::io_serviceio_service;

tcp::endpointend_point(boost::asio::ip::address::from_string("127.0.0.1"), 3200);



tcp::socketsocket(io_service);

socket.
connect(end_point);



for(;;)

{

boost::array<char, 128> buf;

boost::system::error_codeerror;



size_tlen = socket.
read_some(boost::asio::buffer(buf), error);



if(error == boost::asio::error::eof)

break;// Connection closed cleanly by peer.

elseif(error)

throwboost::system::system_error(error);// Some other error.



std::cout.write(buf.data(), len);

}

}

catch(std::exception& e)

{

std::cerr << e.what() << std::endl;

}



return0;

}

主要流程如下:

  1. 通过tcp::socket类定义一个tcp client对象socket
  2. 通过connect函数连接服务器,打开socket连接。
  3. 通过read_some函数来读数据

另外,还可以通过write_some来写数据,通过close来关闭socket连接(这里是通过释放socket对象隐式释放连接)。

服务器

服务器代码如下:

#include

#include

#include

#include



usingnamespaceboost;

usingboost::asio::ip::tcp;



intmain()

{

try

{

asio::io_serviceio_service;

tcp::acceptoracceptor(io_service,tcp::endpoint(tcp::v4(), 3200));



for(;;)

{

tcp::socketsocket(io_service);

acceptor.accept(socket);



time_tnow = time(0);

std::stringmessage = ctime(&now);



system::error_codeignored_error;

socket.write_some(asio::buffer(message), ignored_error);

}

}

catch(std::exception& e)

{

std::cerr << e.what() << std::endl;

}



return0;

}

主要流程如下:

  1. 通过tcp::acceptor创建一个tcp server对象,并绑定端口(也可以不在构造器中自动绑定,而通过bind函数手动绑定)
  2. 通过accept函数获取远端连接
  3. 通过远端连接的write_some函数将数据发往客户端

异步服务器

前面的服务器是同步版本,在大并发的场景下一般需要用到异步socket。服务器的异步版本如下:

#include

#include

#include

#include

#include

#include



usingboost::asio::ip::tcp;

usingnamespacestd;



voidprocess_client(shared_ptr<tcp::socket>client)

{

time_tnow = time(0);

shared_ptr<string> message(newstring(ctime(&now)));



autocallback = =>

这个异步版本的逻辑倒不是很复杂,基本上和.net中传统的异步socket相似,不过需要注意的是,由于c++中内存需要自己管理,而asio框架也没有提供任何管理机制,因此需要注意async_accept、async_send等函数的参数生命周期,切记不能在里面传入栈变量的引用。如果是堆变量,需要确保释放,本例中我是通过share_ptr来实现的自动释放。

更多的示例请参看asio官方文档
原文链接: https://www.cnblogs.com/TianFang/archive/2013/02/02/2890529.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/77491

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午5:59
下一篇 2023年2月9日 下午5:59

相关推荐