tcp_sync_server and tcp_sync_client
#include <iostream>
#include <fstream>
#include <sstream>
#include <boost/asio.hpp>
using namespace std;
using boost::asio::ip::tcp;
const char* serviceList = "\n\t Services\n"
"\t**************************\n"
"\t[1] Get current time.\n"
"\t[2] Who's online.\n"
"\t[3] Get system info.\n"
"\t**************************\n\n"
"Please pick a service[1-3]: ";
ifstream fin;
void getResult(const string& cmdPrefix, const char* outputFile,
string& res) {
// cmd == "w > who"
string cmd(cmdPrefix + outputFile);
system(cmd.c_str());//将字符串解析为系统命令,然后执行
fin.open(outputFile);//存在打开文件,否则创建
if (fin) { ostringstream os; os << fin.rdbuf(); res = os.str();
}
if (fin.is_open()) { fin.close(); }
}
string getServiceContent(const int& select) {
string res;
switch (select) { //time(0)获取当前时间,ctime将时间转换成字
符串。 case 1: { time_t t = time(0); res = ctime(&t); break;
} case 2: getResult("w > ", "who", res); break; case 3: getResult("uname -a > ", "uname", res); break;
default: res = "Sorry, no such service.\n"; break; }
return res; }
int main() { try { boost::asio::io_service io_service; // #1
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4 //tcp::endpoint(端点)由ip地址,端口号,协议版本组成。
(), 8868)); // #2 for (;;) { tcp::socket socket(io_service); // #3 /不断创建socket对象,并且与acceptor进行关联
acceptor.accept(socket); // #4
// 1, send service list to client
boost::system::error_code ignored_error;
boost::asio::write(socket, boost::asio::buffer(serviceList), //buffer相当于显示器的一个缓冲,临时存储数据的一个容器
boost::asio::transfer_all(), ignored_error); //自我感觉read和write是一个固定套路
// 2, receive selection from client char selection[20];
size_t n = socket.read_some(boost::asio::buffer(selection),
ignored_error); // 3, send response
string response = getServiceContent(atoi(selection));
boost::asio::write(socket, boost::asio::buffer(response),
boost::asio::transfer_all(), ignored_error);
} // #6 } catch (std::exception& e) {
std::cerr << e.what() << std::endl; }
return 0; }
************************************************************************
/* * tcp_sync_client.cpp * * Created on: 2010-3-16 上午11:47:12 * Author: kwarph * Web: http://www.xuanyuan-soft.cn * Mail: kwarph@gmail.com */
#include <iostream>
#include <boost/asio.hpp>
using namespace std;
using boost::asio::ip::tcp;
int main(int argc, char* argv[]) {
try { // 1, 创建io_service对象
boost::asio::io_service io_service;
// 2, 创建resolver对象关联到io_service对象
tcp::resolver resolver(io_service);
// 3, 创建一个查询对象
tcp::resolver::query query("localhost", "8868");
// 4, 用resolver对象和查询对象获取可用服务器地址
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); //把用resolve解析query的即localhost首地址给endpoint_iterator tcp::resolver::iterator end;
//iterator就是endpoint的指针
// 5, 创建tcp::socket对象,关联到io_service
tcp::socket socket(io_service);
// 6, socket对象发起到服务器端的同步连接操作
boost::system::error_code error = boost::asio::error::host_not_found;
while (error && endpoint_iterator != end) { socket.close();
socket.connect(*endpoint_iterator++, error); }
if (error) // 如果没有一个地址能连接成功,则抛出异常
throw boost::system::system_error(error);
// 7, 一系列 同步read()和write()
char buf[512];
//1. receive service list from server
// size_t len = socket.read_some(boost::asio::buffer(buf), error); //
size_t len = socket.receive(boost::asio::buffer(buf), 0, error);
//2.confirm size of info with server//进行read操作时,先socket.read_some r然后才是asio::read. write则相反,需先asio::write,再socket.write_some,b并且还要socket.send
size_t len = boost::asio::read(socket, boost::asio::buffer(buf), boost::asio::transfer_at_least(1), error);//asio读写时的参数更多
buf[len] = '\0'; cout << buf;
string selection; cin >> selection;
//3. send selection to server //
boost::asio::write(socket, boost::asio::buffer(selection), //
boost::asio::transfer_all(), error);
// socket.write_some(boost::asio::buffer(selection,selection.size()), error);
socket.send(boost::asio::buffer(selection,selection.size()),0, error);
//4. receive response from server
len = socket.read_some(boost::asio::buffer(buf), error);
buf[len] = '\0'; cout << buf; } catch (std::exception& e) {
std::cerr << e.what() << std::endl; }
return 0; }
tcp_sync_server and tcp_sync_client的更多相关文章
随机推荐
- windows server 2008使用nginx转发API异常解决办法
公司比较传统,一直使用的JSP做项目,没有遇到过跨域问题. 最近因为公司接到一个微信spa项目,因为考虑到项目需要调用老接口,斗胆选择nginx(1.12.1)做接口转发服务, 开发环境使用的win1 ...
- dedecms下的tplcache模板缓存文件过多怎么清理?
时间:2016-04-18 09:32来源:www.ucbug.cc作者:网络 相信很多站长,或者seoer人员在备份用dedecms程序开发的网站时,发现下载到tplcache这个文件夹内容时候花了 ...
- 云主机与vps虚拟主机的区别
云计算时代,云主机其可扩展性.价格便宜.安全可靠的特性深受企业和开发者欢迎,但目前有些IDC企业,新瓶装旧酒,将虚拟主机.VPS进行包装推出所谓的云主机服务,为了帮助用户更好的辨别和挑选云主机,下文详 ...
- 高级设置电脑系统windows7防火墙出错代码0×6D9原因与解决技巧
高级设置windows防火墙能够更好的保护电脑系统安全,在电脑系统windows7设置过程中难免会遇到某些问题,有用户在安装MRGT后想要打开SNMP的161端口,但在打开高级安全windows防火墙 ...
- HTML meta refresh 刷新与跳转(重定向)页面
下面为各位整理了一些HTML meta refresh 刷新与跳转(重定向)页面的例子吧,后面本站长自己也补充了一些js页面刷新与跳转例子吧. refresh 属性值 -- 刷新与跳转(重定向)页 ...
- web.xml 报错
1.The markup in the document following the root element must be well-formed. 原因是配置时没有 放在根下 <web-a ...
- win7 使用anaconda安装tensorflow并且在jupyter notebook上启动
记录一下学习深度学习的小事情: 1.tensorflow 现在只支持windows 64位系统: 2.因为实验室的电脑比较老旧,Gpu配置低,所以选择安装的是tensorflow Cpu版本,对于学习 ...
- border样式?
border样式? 设置边框样式: border:宽度 外形 颜色:(自动设置顺序:top,right,bottom,left) boeder-top:宽度 外形 颜色:(单独为某一个边边框设置样式) ...
- RChain节点通信机制(上)
在介绍RChain的通信机制之前,先简单介绍一些以太坊的通信机制,它包括以下几个方面,如下详细了解以太坊的通信机制,可以查看https://github.com/ethereum/devp2p/blo ...
- Python一些方法的用法集锦
1.range()方法: >>>range(5) [0, 1, 2, 3, 4] >>>a= ["heke","sdsdjs" ...