boost::asio 的daytime客户端和服务器实例
2016-07-18 01:12
351 查看
1. 服务器端
server.h#include <boost/asio.hpp> #include <boost/array.hpp> using boost::asio::ip::tcp; using namespace boost::asio; #include <memory> #include <utility> #include <vector> #include <ctime> #include <iostream> // A reference-counted non-modifiable buffer class. //buffer类,用来保存要发送的消息。 class shared_const_buffer { public: // Construct from a std::string. explicit shared_const_buffer(const std::string& data) : data_(new std::vector<char>(data.begin(), data.end())), buffer_(boost::asio::buffer(*data_)) { } // Implement the ConstBufferSequence requirements. typedef boost::asio::const_buffer value_type; typedef const boost::asio::const_buffer* const_iterator; const boost::asio::const_buffer* begin() const { return &buffer_; } const boost::asio::const_buffer* end() const { return &buffer_ + 1; } private: std::shared_ptr<std::vector<char> > data_; boost::asio::const_buffer buffer_; }; //处理socket class Session:public std::enable_shared_from_this<Session> { public: Session(tcp::socket socket) : m_socket(std::move(socket)){} void start(){ std::cout << "connect" << std::endl; do_write(); //框架内部,可修改问其他服务器的功能。 } private: void do_write(){ std::time_t now = std::time(0); shared_const_buffer buffer(std::ctime(&now)); auto self(shared_from_this()); boost::asio::async_write(m_socket, buffer, [this, self](boost::system::error_code /*ec*/, std::size_t /*length*/) { }); } private: tcp::socket m_socket; }; //服务器主程序,循环异步分发socket事件。 class Server { public: Server(io_service &ios, short port) : m_acceptor(ios, tcp::endpoint(tcp::v4(), port)), m_socket(ios) { do_accept(); } private: void do_accept(){ m_acceptor.async_accept(m_socket, [this](boost::system::error_code ec){ if (!ec){ std::make_shared<Session>(std::move(m_socket))->start(); } do_accept(); //循环 }); } private: tcp::socket m_socket; tcp::acceptor m_acceptor; };
main.cpp
#include <boost/asio.hpp> using namespace boost::asio; #include "server.h" int main() { io_service ios; int port = 6677; Server server(ios, port); ios.run(); return 0; }
2. 客户端
main.cpp//stl #include <iostream> //boost #include <boost/asio.hpp> #include <boost/array.hpp> int main(int argc, char **argv) { boost::asio::io_service ios; boost::asio::ip::tcp::socket socket(ios); //连接 boost::asio::ip::tcp::resolver resolver(ios); auto endpoint_iterator = resolver.resolve({ "127.0.0.1", "6677" }); boost::asio::connect(socket, endpoint_iterator); for (;;){ boost::array<char, 128> buf; boost::system::error_code error; size_t len = socket.read_some(boost::asio::buffer(buf), error); //读取数据 if (error == boost::asio::error::eof) break; // Connection closed cleanly by peer. else if (error) throw boost::system::system_error(error); // Some other error. std::cout.write(buf.data(), len); } }
相关文章推荐
- 京城游戏人-Day4:Prefab 预制件用法(1)
- 超实用的JavaScript代码段 Item7 -- “&&”和“||”操作符总结
- JavaEE学习笔记之SSH—Spring(3)
- 通配符 正则常用对比
- UVA 11858 Frosh Week 逆序对统计
- 京城游戏人-Day3:对摄像机/屏幕尺寸关系的理解(1)
- 自定义Activity标题栏
- XMLHTTPRequest使用【学习笔记】
- Android权威编程指南学习笔记1
- 监听EditText输入状态,根据是否有输入内容显示ImageButton(清空按钮)
- 371. Sum of Two Integers
- Android 热补丁的一些总结
- 弦图的PERFECT ELIMINATION点排列
- 代码中设置光标显示在EditText文本末尾
- 代码中设置EditText输入类型
- Android JNI初步☞Java方法和native方法关联
- 设置Activity全屏显示
- C语言中%p,%u,%lu都有什么用处
- android实现消息推送的解决方案
- 设置一启动Activity就弹出键盘