客户端:

// BoostDev.cpp: 定义控制台应用程序的入口点。
// #include "stdafx.h" #include <iostream>
#include <boost/array.hpp>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <boost/cerrno.hpp> size_t read_complete(char * buf, const boost::system::error_code & err, size_t bytes)
{
if (err) return ;
bool found = std::find(buf, buf + bytes, '\n') < buf + bytes
;
// 我们一个一个读取直到读到回车, 不缓存
return found ? : ;
}
void sync_echo(std::string msg) {
msg += "\n";
std::cout << msg << std::endl;
boost::asio::io_service service;
//boost::asio::ip::tcp::endpoint ep(boost::asio::ip::tcp::v4(), 2001); // listen on 2001
boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"),);
boost::asio::ip::tcp::socket sock(service);
sock.connect(ep);
sock.write_some(boost::asio::buffer(msg));
char buf[];
int bytes = read(sock, boost::asio::buffer(buf), boost::bind(read_complete, buf, _1, _2));
std::cout << bytes << std::endl;
std::string copy(buf, bytes - );
msg = msg.substr(, msg.size() - );
std::cout << "server echoed our " << msg << ": " << (copy == msg ? "OK" : "FAIL") << std::endl;
sock.close();
}
int main(int argc, char* argv[]) {
const char* messages[] = {"John says hi", "so does James", "Lucyjust got home", "Boost.Asio is Fun!", };
boost::thread_group threads;
for (const char ** message = messages; *message; ++message) {
threads.create_thread(boost::bind(sync_echo, *message));
boost::this_thread::sleep(boost::posix_time::millisec());
}
threads.join_all();
}

服务端:

// BoostSever.cpp: 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <ctime>
#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/thread.hpp> size_t read_complete(char * buff, const boost::system::error_code & err, size_t
bytes) {
if (err) return ;
bool found = std::find(buff, buff + bytes, '\n') < buff + bytes;
// 我们一个一个读取直到读到回车, 不缓存
return found ? : ;
}
void handle_connections() {
boost::asio::io_service service;
boost::asio::ip::tcp::acceptor acceptor(service, boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("127.0.0.1"), ));
char buff[];
while (true) {
boost::asio::ip::tcp::socket sock(service);
acceptor.accept(sock);
int bytes = read(sock, boost::asio::buffer(buff), boost::bind(read_complete, buff, _1, _2));
std::cout << bytes << std::endl;
std::string msg(buff, bytes);
sock.write_some(boost::asio::buffer(msg));
sock.close();
}
}
int main(int argc, char* argv[]) {
handle_connections();
}

boost::asio之(一)简单客户端服务器回显功能的更多相关文章

  1. Linux 下 简单客户端服务器通讯模型(TCP)

    原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...

  2. springmvc+ztree v3实现类似表单回显功能

    在做权限管理系统时,可能会用到插件zTree v3,这是一个功能丰富强大的前端插件,应用很广泛,如异步加载菜单制作.下拉选择.权限分配等.在集成SpringMVC中,我分别实现了zTree的添删改查, ...

  3. (原创)如何使用boost.asio写一个简单的通信程序(二)

    先说下上一篇文章中提到的保持io_service::run不退出的简单办法.因为只要异步事件队列中有事件,io_service::run就会一直阻塞不退出,所以只要保证异步事件队列中一直有事件就行了, ...

  4. (原创)如何使用boost.asio写一个简单的通信程序(一)

    boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...

  5. 5.4.1 termios结构,关闭回显功能,一键入字符fgetc立刻返回,不用按下回车键

    Linux提供了一组编程接口,用来控制终端驱动程序的行为.这样我们可以更精细的来控制终端. 例如: 回显:允许控制字符的回显,例如读取密码时. 使用termios结构的密码程序 #include &l ...

  6. activiti官网实例项目activiti-explorer之扩展多选框回显功能

    相关参考链接:https://blog.csdn.net/murongxuesheng/article/details/76147380 回显:确认选中属性ng-model,循环属性ng-repeat ...

  7. HTML、jsp页面中radio,checkbox,select数据回显功能,默认被选中问题

    最近常常遇到各种复选框.单选框.下拉框的默认被选中的问题,开始也是绞尽脑汁的想办法,今天写一篇学习总结的博文来写一下学习总结. 单选框(radio)默认被选中: 一.jstl技术进行回显 <in ...

  8. unp TCP 客户端服务器回射程序中对SIGCHLD信号的处理

    第五章中,有一个例子模拟客户端并发的终止TCP连接,服务器捕捉并处理SIGCHLD信号并调用waitpid函数防止僵死进程的出现.信号处理函数中核心的一句是: , &statloc, WNOH ...

  9. <select>改造成<s:select>实现表单的回显功能

    初始: <select name="viewType"> <option value="0">全部主题</option> & ...

随机推荐

  1. Scrapy运行流程

    接下来的图表展现了Scrapy的架构,包括组件及在系统中发生的数据流的概览(绿色箭头所示). 下面对每个组件都做了简单介绍,并给出了详细内容的链接.数据流如下所描述. 来源于https://scrap ...

  2. 转载 信号量 <第六篇>

    一.ManualResetEvent 该对象有两种信号量状态True和False.构造函数设置初始状态.简单来说, 如果构造函数由true创建,则第一次WaitOne()不会阻止线程的执行,而是等待R ...

  3. 【JDK和Open JDK】平常使用的JDK和Open JDK有什么区别(转)

    文章转自https://www.cnblogs.com/sxdcgaq8080/p/7487369.html 注意到这个问题,是在CentOS7上安装JDK的时候,查找相关的资料,发现安装JDK之前都 ...

  4. 搭建OpenResty(Nginx+Lua)

    这篇文章是一个多月前写的,当时之所以搭建这个是为了最大程度上发挥Nginx的高并发效率(主要是结合lua脚本),参考的话,主要参考张开涛先生写的跟开涛学Nginx+lua系列文章,地址为:https: ...

  5. 20175310 《Java程序设计》第5周学习总结

    20175310 <Java程序设计>第5周学习总结 本周博客: <20175310 迭代和JDB - 20175310xcy - 博客园> https://www.cnblo ...

  6. Vue2---父子组件之间的访问

    个人小总结:1年多没有写博客,感觉很多知识点生疏了,虽然工作上能解决问题,但是当别人问到某个知识点的时候,还是迷迷糊糊的,所以坚持写博客是硬道理的,因为大脑不可能把所有的知识点记住,有可能某一天忘了, ...

  7. B-Tree外存数据结构 _(外存储器—磁盘)第一部分

    1.外存储器—磁盘 计算机存储设备一般分为两种:内存储器(main memory)和外存储器(external memory).内存存取速度快,但容量小,价格昂贵,而且不能长期保存数据(在不通电情况下 ...

  8. pacman详解及常见问题

    安装软件包:软件包有很多可选依赖,是为软件提供额外功能, 安装软件时pacman 会输出可选依赖, 但不会在 pacman.log中,浏览安装软件的可选以来可用pacman -Si得到可选依赖的简短描 ...

  9. android的学习网站

    1,Android系统简介2,ProGuard代码混淆3,讲讲Handler+Looper+MessageQueue关系4,Android图片加载库理解5,谈谈Android运行时权限理解6,Even ...

  10. IDEA Maven Jetty Jrebel 热部署

    准备:1.下载Jrebel的离线安装包,版本是6.4.3版本.            2.下载Jrebel的破解补丁包,同样也是针对6.4.3版本的 Jrebel离线安装包官网下载地址:https:/ ...