1. 程式人生 > >asio寫了一個聊天的基本框架

asio寫了一個聊天的基本框架

sch mut sstream 示例 www. empty bind json logs

示例代碼

技術分享
 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

asio寫了一個聊天的基本框架