当前位置: 首页 > news >正文

异步socket处理

服务器端:

#include <boost/thread.hpp>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

class Server
{
private:
	boost::asio::io_service &ios;
	boost::asio::ip::tcp::acceptor acceptor;
	typedef boost::shared_ptr<boost::asio::ip::tcp::socket> sock_pt;
public:
	Server(boost::asio::io_service &io) : ios(io),
		acceptor(ios, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 6688))
	{
		start();
	}

	void start()
	{
		sock_pt sock(new boost::asio::ip::tcp::socket(ios)); // 智能指针
		acceptor.async_accept(*sock,
			boost::bind(&Server::accept_handler, this, _1, sock)); // 异步监听服务
	}

	void accept_handler(const boost::system::error_code &e, sock_pt sock)
	{
		if (e) // 检测错误码
		{
			return;
		}
		std::cout << "client: ";
		std::cout << sock->remote_endpoint().address() << std::endl;
		sock->async_write_some(boost::asio::buffer("hello client..."),
			boost::bind(&Server::write_hander, this, _1));
		start(); // 再次启动异步监听
	}

	void write_hander(const boost::system::error_code &e)
	{
		std::cout << "send message complete." << std::endl;
	}
};
int main()
{
	try
	{
		std::cout << "server start..." << std::endl;
		boost::asio::io_service ios;
		Server server(ios);
		ios.run(); // 启动异步调用事件处理循环
	}
	catch (std::exception &e)
	{
		std::cout << e.what() << std::endl;
	}
	return 0;
}

  

客户端:

#include <boost/thread.hpp>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <vector>

class Client
{
private:
	boost::asio::io_service &ios;
	boost::asio::ip::tcp::endpoint ep;
	typedef boost::shared_ptr<boost::asio::ip::tcp::socket> sock_pt;
public:
	Client(boost::asio::io_service &io) :ios(io),
		ep(boost::asio::ip::address::from_string("127.0.0.1"), 6688)
	{
		start(); // 启动异步连接
	}
	void start()
	{
		sock_pt sock(new boost::asio::ip::tcp::socket(ios));
		sock->async_connect(ep, boost::bind(&Client::conn_hander, this, _1, sock)); // 异步连接
	}
	void conn_hander(const boost::system::error_code &e, sock_pt sock)
	{
		if (e)
		{
			return;
		}
		std::cout << "recive from " << sock->remote_endpoint().address() << ": ";
		boost::shared_ptr<std::vector<char> > str(new std::vector<char>(100, 0));
		sock->async_read_some(boost::asio::buffer(*str),
			boost::bind(&Client::read_hander, this, _1, str)); // 异步读取数据
		start(); // 再次启动异步连接
	}
	void read_hander(const boost::system::error_code &e, boost::shared_ptr<std::vector<char> > str)
	{
		if (e)
		{
			return;
		}
		std::cout << &(*str)[0] << std::endl;
	}
};
int main()
{
	try
	{
		std::cout << "client start..." << std::endl;
		boost::asio::io_service ios;
		Client client(ios);
		ios.run();
	}
	catch (std::exception &e)
	{
		std::cout << e.what() << std::endl;
	}
		
	return 0;
}

  

转载于:https://www.cnblogs.com/ACGame/p/9114500.html

相关文章:

  • jQuery API的特点
  • 爬虫实战篇(模拟登录)---我们以模拟去哪儿网为例
  • 第 11 章 字符串和字符串函数(命令行参数)
  • vue 应用 :关于 ElementUI 的 message 组件
  • Equal Sums
  • [编程之法]2.2 寻找和为定值的两个数
  • 智能对话机器人实战开发案例剖析(1)- 体系结构和分类
  • 第十二 包
  • java8 数据结构的改变(一)
  • 非正常卸载Chrome浏览器导致无法重新安装
  • FCC(ES6写法) Symmetric Difference
  • Thymeleaf系列五 迭代,if,switch语法
  • vi/vim基本使用命令
  • 排序算法(三)插入排序
  • 单词篇:(单词识记8~9)
  • 收藏网友的 源程序下载网
  • [LeetCode] Wiggle Sort
  • ➹使用webpack配置多页面应用(MPA)
  • Fundebug计费标准解释:事件数是如何定义的?
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JAVA并发编程--1.基础概念
  • js继承的实现方法
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • magento 货币换算
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 基于axios的vue插件,让http请求更简单
  • 记一次用 NodeJs 实现模拟登录的思路
  • 白色的风信子
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #include到底该写在哪
  • #Linux(make工具和makefile文件以及makefile语法)
  • #pragma pack(1)
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (八十八)VFL语言初步 - 实现布局
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (顺序)容器的好伴侣 --- 容器适配器
  • (五)Python 垃圾回收机制
  • (转)详解PHP处理密码的几种方式
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .htaccess配置重写url引擎
  • .net 4.0发布后不能正常显示图片问题
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET 动态调用WebService + WSE + UsernameToken
  • .net 受管制代码
  • .net6使用Sejil可视化日志
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • :如何用SQL脚本保存存储过程返回的结果集
  • @Autowired多个相同类型bean装配问题
  • @property @synthesize @dynamic 及相关属性作用探究
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存