国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

1.5.C++項目:仿muduo庫實現并發(fā)服務器之socket模塊的設計

這篇具有很好參考價值的文章主要介紹了1.5.C++項目:仿muduo庫實現并發(fā)服務器之socket模塊的設計。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

項目完整版在:

一、socket模塊:套接字模塊

1.5.C++項目:仿muduo庫實現并發(fā)服務器之socket模塊的設計,CodeCrafters,c++,服務器,開發(fā)語言

二、提供的功能

Socket模塊是對套接字操作封裝的一個模塊,主要實現的socket的各項操作。

socket 模塊:套接字的功能
創(chuàng)建套接字
綁定地址信息
開始監(jiān)聽
向服務器發(fā)起連接
獲取新連接
接受數據
發(fā)送數據
關閉套接字
創(chuàng)建一個監(jiān)聽鏈接
創(chuàng)建一個客戶端連接
設置套接字選項——開啟地址端口重用!
設置套接字阻塞屬性——設置為非阻塞!

三、實現思想

(一)功能

對socket套接字的操作進行封裝。文章來源地址http://www.zghlxwxcb.cn/news/detail-728986.html

(二)意義

對socket套接字的操作進行封裝。

(三)功能設計

  1. 創(chuàng)建套接字
  2. 綁定地址信息
  3. 開始監(jiān)聽
  4. 向服務器發(fā)起連接
  5. 獲取新連接
  6. 接受數據
  7. 發(fā)送數據
  8. 關閉套接字
  9. 創(chuàng)建一個監(jiān)聽鏈接
  10. 創(chuàng)建一個客戶端連接

四、代碼

#define MAX_LISTEN 1024
class Socket {
        private:
                int _sockfd;
        public:
                Socket() :_sockfd(-1) {}
                Socket(int fd) : _sockfd(fd) {} 
                ~Socket() {Close(); }
                int fd() {return _sockfd;}
                // 1.創(chuàng)建套接字
                bool Create() {
                
                        //int socket (int domain,int type,int protocol);
                        _sockfd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
                        if (_sockfd < 0) {
                                ERR_LOG("CREATE SOCKET FAILED !!");
                                return false;
                        }
                        return true;
                } 
                // 2.綁定地址信息
                bool Bind(const std::string &ip,uint16_t port) {
	       
                        struct sockaddr_in addr;
                        addr.sin_family = AF_INET;
                        addr.sin_port = htons(port);
                        addr.sin_addr.s_addr = inet_addr(ip.c_str());
                        socklen_t len = sizeof(struct sockaddr_in);
                        // int bind(int sockfd,struct sockaddr * addr,socklen_t len);
                        int ret = bind(_sockfd,(struct sockaddr*)&addr,len);
                        if (ret < 0) {
                                ERR_LOG("BIND ADDRESS FAILED!!!!");
                                return false;
                        }
                        return true;
                }
                 // 3.開始監(jiān)聽
                bool Listen(int backlog = MAX_LISTEN) {
                        // int listen(int backlog)
                        int ret = listen(_sockfd,backlog);
                        if (ret < 0) {
                                ERR_LOG("SOCKET LISTEN FAILED!!");
                                return false;
                        }
                        return true;
                }
                 // 4. 向服務器發(fā)起連接
                bool Connect(const std:: string& ip,uint16_t port) {
                
                        struct sockaddr_in addr;
                        addr.sin_family = AF_INET;
                        addr.sin_port = htons(port);
                        addr.sin_addr.s_addr = inet_addr(ip.c_str());
                        socklen_t len = sizeof(struct sockaddr_in);
                        // int bind(int sockfd,struct sockaddr * addr,socklen_t len);
                        int ret = connect(_sockfd,(struct sockaddr*)&addr,len);
                        if (ret < 0) {
                                ERR_LOG("CONNECT ADDRESS FAILED!!!!");
                                return false;
                        }
                        return true;
                } 
                // 5. 獲取新連接
                int Accept() {
                
                        // int accept(int sockfd,struct sockaddr* addr,socklen_t *len) /
                        int newfd = accept(_sockfd,NULL,NULL);
                        if (newfd < 0) {
                                ERR_LOG("SOCKET ACCEPT FAILED!!!!");
                                return false;
                        }
                        return newfd;
                }
                ssize_t Recv(void *buf,size_t len,int flag = 0){
                        // 6.接收數據
                        //有符號長整型 
                        //ssize_t Recv(int sockfd,void* buf,size_t len,int flag);
                        ssize_t ret = recv(_sockfd,buf,len,flag);
                        if (ret <= 0) {
                                // EAGAIN 當前socket的接收緩沖區(qū)沒有數據來,在非阻塞二點情況下才會有這個錯誤
                                // ENTER 當前socket的阻塞等待,被信號打斷了
                                if (errno == EAGAIN || errno == EINTR) {
                                        return 0; // 沒收到數據
                                }
                                ERR_LOG("SOCKET RECV FAILED!!");
                                return -1; // 出錯
                        }
                        return ret;
                }
                ssize_t nonBlockRecv(void* buf,size_t len) {
                        return Recv(buf,len,MSG_DONTWAIT); // MSG_DONTWAIT 表示當前接受為非阻塞
                }
	        // 7.發(fā)送數據
                ssize_t Send(const void* buf,size_t len,int flag = 0) {
                        // ssize_t send(int sockfd,void *data,size_t len,int flag) 
                        ssize_t ret = send(_sockfd,buf,len,flag);
                        if (ret < 0) {
                                ERR_LOG("SOCKET SEND FAILED!!");
                                return -1; // 出錯
                        }
                        return ret; // 實際發(fā)送數據長度??!
                }
                ssize_t nonBlockSend(void* buf,size_t len) {
                        return Send(buf,len,MSG_DONTWAIT); // MSG_DONTWAIT 表示當前接受為非阻塞
                }
	        // 8.關閉套接字
                void Close() {
                        if (_sockfd != -1) {
                                close(_sockfd);
                                _sockfd = -1;
                        }
                
                }
	        // 9.創(chuàng)建一個服務端鏈接
                bool createServer(uint16_t port, const std::string &ip = "0.0.0.0", bool block_flag = false) {
                        // 1.創(chuàng)建套接字 2. 綁定地址 3.開始監(jiān)聽 4.設置非阻塞 5.啟動地址重用
                        if (Create() == false) return false;
                        if (Bind(ip,port) == false) return false;
                        if (Listen() == false) return false;
                       if (block_flag) NonBlock();
                        ReuseAddress();
                        return true;
                }
                // 10.創(chuàng)建一個客戶端鏈接 
                bool createClient(uint16_t port, const std::string &ip) {
                        if (Create() == false) return false;
                        if (Connect(ip,port) == false) return false;
                        return true;
                }

                // 11. 設置套接字選項——開啟地址端口重用!
                void ReuseAddress() {
                        // int setsockopt(int fd,int leve,int optname,void *val,int vallen)
                        int val = 1;
                        setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR, (void*)&val, sizeof(int));
                        val = 1;
                        setsockopt(_sockfd, SOL_SOCKET, SO_REUSEPORT, (void*)&val, sizeof(int));
                }
                // 12. 設置套接字阻塞屬性——設置為非阻塞! 
                void NonBlock() {
                        int flag = fcntl(_sockfd, F_GETFL, 0);
                        fcntl(_sockfd, F_SETFL, flag | O_NONBLOCK);
                }

};

五、測試

(一)tcp_cli.cc

#include "../source/server.hpp"

int main() {
    Socket cli_sock;
    cli_sock.createClient(8500,"127.0.0.1");
    std::string str = "nihao";
    cli_sock.Send(str.c_str(),str.size());
    char buf[1024] = {0};
    cli_sock.Recv(buf,1023);
    DBG_LOG("%s",buf);
    return 0;
}

(二)tcp_srv.cc

#include "../source/server.hpp"

int main() {
    Socket lst_sock;
    bool ret = lst_sock.createServer(8500);
    while (1) {
        int newfd = lst_sock.Accept();
        if (newfd < 0) {
            continue;
        }
        Socket cli_sock(newfd);
        char buf[1024] = {0};
        int ret = cli_sock.Recv(buf,1023);
            if(ret < 0) {
            cli_sock.Close();
        }
        cli_sock.Send(buf,ret);
        cli_sock.Close();
    }
    lst_sock.Close();
    return 0;
}

(三)makefile

all:client server
client:tcp_cli.cc
	g++ -std=c++11 $^ -o $@
server:tcp_srv.cc
	g++ -std=c++11 $^ -o $@

到了這里,關于1.5.C++項目:仿muduo庫實現并發(fā)服務器之socket模塊的設計的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 1.16.C++項目:仿muduo庫實現并發(fā)服務器之HttpContext以及HttpServer模塊的設計

    1.16.C++項目:仿muduo庫實現并發(fā)服務器之HttpContext以及HttpServer模塊的設計

    添加請求—— 處理函數映射信息(GET/POST/PUT/DELETE) 設置靜態(tài)資源根目錄 設置是否啟動超時連接關閉 設置線程池中線程數量 啟動服務器 OnConnected - 用于給TcpServer設置協議上下文 OnMessage - 用于進行緩沖區(qū)數據解析處理 獲取上下文,進行緩沖區(qū)數據對象 請求的路由查 找 靜態(tài)資

    2024年02月07日
    瀏覽(35)
  • 【項目設計】仿 muduo 庫實現 OneThreadOneEventLoop 式并發(fā)服務器

    【項目設計】仿 muduo 庫實現 OneThreadOneEventLoop 式并發(fā)服務器

    本項目主要是模仿 muduo 庫實現一個以主從 Reactor 為模型,以 OneThreadOneEventLoop 為事件驅動的高并發(fā)服務器組件。通過這個服務器組件,我們可以簡潔快速的搭建出一個高性能的 TCP 服務器。并且組件內部會提供不同的應用層協議支持,組件使用者可以通過這些協議快速的完成

    2024年04月23日
    瀏覽(39)
  • 一、C++項目:仿muduo庫實現高性能高并發(fā)服務器

    一、C++項目:仿muduo庫實現高性能高并發(fā)服務器

    仿mudou庫one thread oneloop式并發(fā)服務器實現 仿muduo庫One Thread One Loop式主從Reactor模型實現高并發(fā)服務器: 通過實現的高并發(fā)服務器組件,可以簡潔快速的完成一個高性能的服務器搭建。并且,通過組件內提供的不同應用層協議支持,也可以快速完成一個高性能應用服務器的搭建

    2024年02月07日
    瀏覽(34)
  • 仿muduo庫實現one thread one loop式并發(fā)服務器

    仿muduo庫實現one thread one loop式并發(fā)服務器

    ? 文章目錄 一、項目簡介 二、項目整體認識 2、1?HTTP服務器 2、2 Reactor模型 三、預備知識 3、1 C++11 中的 bind 3、2?簡單的秒級定時任務實現 3、3?正則庫的簡單使用 3、4?通用類型any類型的實現 四、服務器功能模塊劃分與實現 4、1 Buffer模塊 4、2 Socket模塊 4、3 Channel模塊 4、

    2024年04月09日
    瀏覽(23)
  • 從零開始實現一個C++高性能服務器框架----Socket模塊

    此項目是根據sylar框架實現,是從零開始重寫sylar,也是對sylar豐富與完善 項目地址:https://gitee.com/lzhiqiang1999/server-framework 項目介紹 :實現了一個基于協程的服務器框架,支持多線程、多協程協同調度;支持以異步處理的方式提高服務器性能;封裝了網絡相關的模塊,包括

    2023年04月08日
    瀏覽(32)
  • 網絡socket服務器開發(fā)幾種并發(fā)模型詳解

    網絡socket服務器開發(fā)幾種并發(fā)模型詳解

    目錄 一、socket創(chuàng)建流程。 二、I/O多路復用 三、服務器開發(fā)常見的并發(fā)模型 1、模型一:單線程——無IO復用 1.1 模型分析 2、模型二:單線程accept + 多線程讀寫業(yè)務(無IO復用) 模型分析 3、模型三:單線程多路IO復用 模型分析 ?4、模型四:單線程多路IO復用 + 多線程業(yè)務工作

    2024年02月11日
    瀏覽(28)
  • 基于muduo網絡庫實現的集群聊天服務器

    基于muduo網絡庫實現的集群聊天服務器

    ?。?!項目是照著騰訊課堂施磊老師的視頻學習,僅供個人學習記錄使用?。?! !??!項目是照著騰訊課堂施磊老師的視頻學習,僅供個人學習記錄使用?。?! !?。№椖渴钦罩v訊課堂施磊老師的視頻學習,僅供個人學習記錄使用?。。?使用muduo網絡庫搭建網絡核心模塊

    2024年04月26日
    瀏覽(19)
  • 【實戰(zhàn)項目】c++實現基于reactor的高并發(fā)服務器

    【實戰(zhàn)項目】c++實現基于reactor的高并發(fā)服務器

    基于Reactor的高并發(fā)服務器,分為反應堆模型,多線程,I/O模型,服務器,Http請求和響應五部分 ?全局 Channel 描述了文件描述符以及讀寫事件,以及對應的讀寫銷毀回調函數,對應存儲arg讀寫回調對應的參數 ?Channel 異或 |:相同為0,異為1 按位與:只有11為1,其它組合全部

    2024年02月12日
    瀏覽(32)
  • 基于多反應堆的高并發(fā)服務器【C/C++/Reactor】(中)Channel 模塊的實現

    基于多反應堆的高并發(fā)服務器【C/C++/Reactor】(中)Channel 模塊的實現

    在這篇文章中雖然實現了能夠和多客戶端建立連接,并且同時和多個客戶端進行通信。 基于多反應堆的高并發(fā)服務器【C/C++/Reactor】(上)-CSDN博客 https://blog.csdn.net/weixin_41987016/article/details/135141316?spm=1001.2014.3001.5501 但是有一個 問題(O_O)? : 這個程序它是單線程的。如果我們想

    2024年02月03日
    瀏覽(94)
  • C++項目——集群聊天服務器項目(一)項目介紹、環(huán)境搭建、Boost庫安裝、Muduo庫安裝、Linux與vscode配置

    C++項目——集群聊天服務器項目(一)項目介紹、環(huán)境搭建、Boost庫安裝、Muduo庫安裝、Linux與vscode配置

    今天開始想更新一個C++項目,實現一個 支持跨服務器通信、支持負載均衡的集群聊天服務器項目 。項目會應用muduo網絡庫、CMake編譯、MySQL數據庫、JSon序列化與反序列化、Redis消息訂閱模式以及Nginx負載均衡功能。 有興趣的寶可以跟我一起實操起來,鞏固自己的C++學習吧~ 本項

    2024年04月14日
    瀏覽(91)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包