分享一個自己使用了很久的C++網路封裝庫,包含服務端和用戶端,支援跨平台

來源:互聯網
上載者:User

標籤:

其實就只是對網路底層的一個封裝,一些回調全部都已經封裝好,直接指定相應的回呼函數就可以對收到的資料包進行處理。

個人覺得該網路程式庫比較方便的地方就是可以直接將所有自訂及C++標準庫容器直接發送到服務端,而原始的C函數發送時連續儲存的記憶體。

注意,該庫使用C11編譯,所以用戶端必須支援C11,廢話不多說下面直接看使用demo。

 

協議定義(protocols.h)

 1 #pragma once   2 #include "protocolbase.h"   3    4    5 //用戶端請求登入   6 class QLogin :public Net::ProtocolBase   7 {   8 public:   9     QLogin() = default;  10     ~QLogin() = default;  11   12     Serialize(QLogin)  13     {  14         ar(uClientId, strUsername, strPassword);  15     }  16   17     Net::UInt32 uClientId;  18     std::string strUsername;  19     std::string strPassword;  20 };  21   22 //用戶端請求資料  23 class QData :public Net::ProtocolBase  24 {  25 public:  26     QData() = default;  27     ~QData() = default;  28   29     Serialize(QData)  30     {  31   32     }  33 };  34   35   36 //響應用戶端登入  37 class RLogin :public Net::ProtocolBase  38 {  39 public:  40     RLogin() = default;  41     ~RLogin() = default;  42   43     Serialize(RLogin)  44     {  45         ar(strErrorInfo);  46     }  47   48     std::string strErrorInfo;  49 };  50   51 class CustomData  52 {  53 public:  54     CustomData() = default;  55     ~CustomData() = default;  56   57     Serialize(CustomData)  58     {  59         ar(nData, fData, dData, shData);  60     }  61   62     int nData;  63     float fData;  64     double dData;  65     short shData;  66 };  67   68   69 //響應用戶端請求資料  70 class RData :public Net::ProtocolBase  71 {  72 public:  73     RData() = default;  74     ~RData() = default;  75   76     Serialize(RData)  77     {  78         ar(strNickname, bSex, uAge, strEmail, vData, mData, customData);  79     }  80   81     std::string strNickname;  82     bool bSex;  83     Net::UInt8 uAge;  84     std::string strEmail;  85     std::vector<std::string> vData;  86     std::map<std::string,std::pair<int,float> > mData;  87     CustomData customData;  88 };  

 

main.cpp

#include "socketserver.h"#include "socketclient.h"#include "protocols.h"#include <iostream>class ServerSocketSession :public Net::SocketSession{public:ServerSocketSession() = default;~ServerSocketSession(){}ServerSocketSession(const ServerSocketSession&) = delete;ServerSocketSession& operator = (const ServerSocketSession&) = delete;//響應使用者登入void userLogin(std::shared_ptr<QLogin> r){auto result = std::make_shared<RLogin>();if (r->uClientId == 123456 && r->strUsername == "123456" &&r->strPassword == "123456"){result->strErrorInfo = "LoginSucceed";}else{result->strErrorInfo = "LoginFailure";}send(result);}//響應使用者請求詳細資料void userData(std::shared_ptr<QData> r){auto result = std::make_shared<RData>();result->strNickname = "winter";result->bSex = true;result->strEmail = "[email protected]";result->uAge = 100;result->mData.emplace("m1",std::make_pair(1111,111.111f));result->mData.emplace("m2", std::make_pair(2222, 222.222f));result->mData.emplace("m3", std::make_pair(3333, 333.333f));result->vData.push_back("v1");result->vData.push_back("v2");result->vData.push_back("v3");result->vData.push_back("v4");result->customData.dData = -10000000.000001f;result->customData.fData = 100000.00002f;result->customData.nData = -100000;result->customData.shData = -100;send(result);}};class ClientSocketSession{public:ClientSocketSession():m_socketClient("127.0.0.1", 6691, true){m_socketClient.registerProtocol(&ClientSocketSession::onUserLogin, this);m_socketClient.registerProtocol(&ClientSocketSession::onUserData, this);m_socketClient.registerProtocol(&ClientSocketSession::onSocketEvent, this);m_socketClient.connect();}~ClientSocketSession() = default;ClientSocketSession(const ClientSocketSession&) = delete;ClientSocketSession& operator = (const ClientSocketSession&) = delete;void update(){ m_socketClient.update(); }void onSocketEvent(std::shared_ptr<Net::SocketEvent> r, Net::SocketClient::ErrorCode e){if (e == Net::SocketClient::ErrorCode::kSucceed && r->getEvent() == Net::SocketEvent::Event::kConnect){std::cout << "Connect succeed! " << r->getInfo() << std::endl;auto qlogin = std::make_shared<QLogin>();qlogin->uClientId = 11111;qlogin->strUsername = "11111";qlogin->strPassword = "11111";m_socketClient.send(qlogin);}else{if (r->getEvent() == Net::SocketEvent::Event::kConnect){std::cout << "Connect: "<< r->getInfo() << std::endl;}else{std::cout << "DisConnect: " << r->getInfo() << std::endl;}}}void onUserLogin(std::shared_ptr<RLogin> r, Net::SocketClient::ErrorCode e){if (r->strErrorInfo == "LoginSucceed"){auto qdata = std::make_shared<QData>();for (size_t i = 0; i < 10; i++){m_socketClient.send(qdata);}}else if (r->strErrorInfo == "LoginFailure"){auto qlogin = std::make_shared<QLogin>();qlogin->uClientId = 123456;qlogin->strUsername = "123456";qlogin->strPassword = "123456";m_socketClient.send(qlogin);}}void onUserData(std::shared_ptr<RData> r, Net::SocketClient::ErrorCode e){std::cout << "Nickname: " << r->strNickname << std::endl;std::cout << "Sex: " << (r->bSex ? "true": "false") << std::endl;std::cout << "Age: " << (int)r->uAge << std::endl;std::cout << "Email: " << r->strEmail << std::endl;for (auto data : r->vData){std::cout << "vData: " << data << std::endl;}for (auto data : r->mData){std::cout << "vData:" << data.first << ":" << data.second.first << ":" << data.second.second << std::endl;}std::cout << "customData.nData: " << r->customData.nData << std::endl; std::cout << "customData.fData: " << r->customData.fData << std::endl;std::cout << "customData.dData: " << r->customData.dData << std::endl;std::cout << "customData.shData: " << r->customData.shData << std::endl;}private:Net::SocketClient m_socketClient;};int wmain(int argc, wchar_t* argv[]){auto server = Net::SocketServer::createInstance<ServerSocketSession>("127.0.0.1", 6691, 1,true);server->registerProtocol(&ServerSocketSession::userLogin);server->registerProtocol(&ServerSocketSession::userData);ClientSocketSession clientSession;//一個簡單的主迴圈bool bExit(true);while (bExit){std::this_thread::sleep_for(std::chrono::milliseconds(50));//在用戶端的每一幀需要調用以下函數。clientSession.update();}return 0;}

  

下面是完整demo,使用vs2013編譯

http://files.cnblogs.com/files/winter-yu/libSocket.zip

分享一個自己使用了很久的C++網路封裝庫,包含服務端和用戶端,支援跨平台

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.