boost asio 一个聊天的基本框架

示例代码 

 1 #include "Util.h"
 2 #include "MyAsio.h"
 3 #include "TcpConnectionManager.h"
 4 #include "SocketMessageRecvDispatchManager.h"
 5 /*
 6 作 者: itdef 
 7 技术博客 http://www.cnblogs.com/itdef/ 
 8 技术交流群 群号码:324164944 
 9 欢迎c c++ windows驱动爱好者 服务器程序员沟通交流 
10 部分老代码存放地点 http://www.oschina.net/code/list_by_user?id=614253
11 */
12 
13 unsigned int  DEF::tcp_connection::i = 0;
14 extern DEF::TcpConnectManager g_tcp_connect_manager;
15 extern DEF::SocketMessageRecvDispatchManager g_socket_message_recv_dispatch_manager;
16 
17 void DEF::AsioLoopThread() {
18     try
19     {
20         boost::asio::io_service io_service;
21         DEF::tcp_server server(io_service);
22         io_service.run();
23     }
24     catch (std::exception& e)
25     {
26         std::cerr << e.what() << std::endl;
27     }
28 }
29 
30 std::thread DEF::StartAsioLoopThread()
31 {
32     std::thread t = std::thread(DEF::AsioLoopThread);
33     return t;
34 }
35 
36 void DEF::tcp_connection::handle_read_head(const boost::system::error_code& error,
37     size_t bytes_transferred)
38 {
39     //收到错误格式信息
40     if (error || bufHead_.flag != '|')
41     {
42         std::weak_ptr<DEF::tcp_connection> wp(shared_from_this());
43         g_tcp_connect_manager.LeaveWithLock(wp);
44         std::cerr << __FUNCTION__ << "(). wrong flag or " << error.message()<< std::endl;
45         return;
46     }
47 
48     boost::asio::async_read(socket_, boost::asio::buffer(recvBuffBody, bufHead_.bufferLenth),
49         boost::bind(&tcp_connection::handle_read_body, shared_from_this(),
50             boost::asio::placeholders::error,
51             boost::asio::placeholders::bytes_transferred));
52 }
53 
54 void DEF::tcp_connection::start()
55 {
56     std::weak_ptr<DEF::tcp_connection> wp(shared_from_this());
57     g_tcp_connect_manager.JoinWithLock(wp);
58 
59     boost::asio::async_read(socket_, boost::asio::buffer(&bufHead_, sizeof(bufHead_)),
60         boost::bind(&tcp_connection::handle_read_head, shared_from_this(),
61             boost::asio::placeholders::error,
62             boost::asio::placeholders::bytes_transferred));
63 }
64 
65 std::string DEF::SharedPtr2StringId(const std::shared_ptr<DEF::tcp_connection>& ptr) {
66     std::stringstream ss;
67     ss << ptr;
68     std::string str_ptr_id;
69     ss >> str_ptr_id;
70     return str_ptr_id;
71 }
72 
73 void DEF::tcp_connection::handle_read_body(const boost::system::error_code& error,
74     size_t bytes_transferred)
75 {
76     if (error) {
77         std::weak_ptr<DEF::tcp_connection> wp(shared_from_this());
78         g_tcp_connect_manager.LeaveWithLock(wp);
79         std::cerr << __FUNCTION__ <<" "<< error.message()<< std::endl;
80         return;
81     }
82     recvBuffBody[bytes_transferred] = '\0';
83     //std::cout << "recv " << recvBuffBody << std::endl;
84     g_socket_message_recv_dispatch_manager.PostSockRecvMessageAndNotify(recvBuffBody);
85     boost::asio::async_read(socket_, boost::asio::buffer(&bufHead_, sizeof(bufHead_)),
86         boost::bind(&tcp_connection::handle_read_head, shared_from_this(),
87             boost::asio::placeholders::error,
88             boost::asio::placeholders::bytes_transferred));
89 }
View Code

消息队列表

 1 #pragma once
 2 #include <mutex>
 3 #include <deque>
 4 #include <string>
 5 
 6 #include "Util.h"
 7 /*
 8 作 者: itdef
 9 技术博客 http://www.cnblogs.com/itdef/
10 技术交流群 群号码:324164944
11 欢迎c c++ windows驱动爱好者 服务器程序员沟通交流
12 部分老代码存放地点 http://www.oschina.net/code/list_by_user?id=614253
13 */
14 NAMESPACEBEGIN(DEF)
15 
16 struct MessageQueueWithLock {
17     std::mutex    messageQueuemtx;
18     std::condition_variable messageQueuecv;
19     volatile bool ready = false;
20     std::deque<std::string> messageDeq;
21 
22     void PostMessageAndNotify(const std::string& json) {
23         std::lock_guard<std::mutex> lck(messageQueuemtx);
24         messageDeq.push_back(json);
25         messageQueuecv.notify_one();
26     }
27 
28     std::string WaitForMessageDequeOnce() {
29         std::string s;
30         {
31             std::unique_lock<std::mutex> lck(messageQueuemtx);
32             while (messageDeq.empty())
33                 messageQueuecv.wait(lck);
34         }
35         {
36             std::lock_guard<std::mutex> lck(messageQueuemtx);
37             if (!messageDeq.empty()) {
38                 s = messageDeq.front();
39                 messageDeq.pop_front();
40             }
41         }
42         return s;
43     }
44 };
45 
46 NAMESPACEEND
View Code

一个全局管理连接的容器 

 1 #pragma once
 2 #pragma once
 3 #include "Util.h"
 4 #include <map>
 5 #include <mutex>
 6 #include <memory>
 7 #include <sstream>
 8 
 9 #include "MyAsio.h"
10 /*
11 作 者: itdef
12 技术博客 http://www.cnblogs.com/itdef/
13 技术交流群 群号码:324164944
14 欢迎c c++ windows驱动爱好者 服务器程序员沟通交流
15 部分老代码存放地点 http://www.oschina.net/code/list_by_user?id=614253
16 */
17 NAMESPACEBEGIN(DEF)
18 //class tcp_connection;
19 class TcpConnectManager {
20 public:
21     typedef std::string SOCKWEAKPTRID;
22     TcpConnectManager() {}
23     ~TcpConnectManager() {}
24 
25     void JoinWithLock(const std::weak_ptr<tcp_connection>& ptr);
26 
27     void LeaveWithLock(const std::weak_ptr<tcp_connection>& ptr);
28 
29     std::weak_ptr<tcp_connection> FindWeakPtrBySockPtrIdWithLock(const std::string& sock_ptr_id);
30     TcpConnectManager& operator=(const TcpConnectManager&) = delete;
31     TcpConnectManager(const TcpConnectManager&) = delete;
32 private:
33     std::mutex mtx;
34     std::map<SOCKWEAKPTRID, std::weak_ptr<DEF::tcp_connection>> connection_infos;
35 };
36 
37 
38 NAMESPACEEND
View Code

 

posted on 2017-11-11 13:33  itdef  阅读(313)  评论(1编辑  收藏  举报

导航