示例代码

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] = '