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

從零開(kāi)始實(shí)現(xiàn)一個(gè)C++高性能服務(wù)器框架----Socket模塊

這篇具有很好參考價(jià)值的文章主要介紹了從零開(kāi)始實(shí)現(xiàn)一個(gè)C++高性能服務(wù)器框架----Socket模塊。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

此項(xiàng)目是根據(jù)sylar框架實(shí)現(xiàn),是從零開(kāi)始重寫sylar,也是對(duì)sylar豐富與完善
項(xiàng)目地址:https://gitee.com/lzhiqiang1999/server-framework

簡(jiǎn)介

項(xiàng)目介紹:實(shí)現(xiàn)了一個(gè)基于協(xié)程的服務(wù)器框架,支持多線程、多協(xié)程協(xié)同調(diào)度;支持以異步處理的方式提高服務(wù)器性能;封裝了網(wǎng)絡(luò)相關(guān)的模塊,包括socket、http、servlet等,支持快速搭建HTTP服務(wù)器或WebSokcet服務(wù)器。
詳細(xì)內(nèi)容:日志模塊,使用宏實(shí)現(xiàn)流式輸出,支持同步日志與異步日志、自定義日志格式、日志級(jí)別、多日志分離等功能。線程模塊,封裝pthread相關(guān)方法,封裝常用的鎖包括(信號(hào)量,讀寫鎖,自旋鎖等)。IO協(xié)程調(diào)度模塊,基于ucontext_t實(shí)現(xiàn)非對(duì)稱協(xié)程模型,以線程池的方式實(shí)現(xiàn)多線程,多協(xié)程協(xié)同調(diào)度,同時(shí)依賴epoll實(shí)現(xiàn)了事件監(jiān)聽(tīng)機(jī)制。定時(shí)器模塊,使用最小堆管理定時(shí)器,配合IO協(xié)程調(diào)度模塊可以完成基于協(xié)程的定時(shí)任務(wù)調(diào)度。hook模塊,將同步的系統(tǒng)調(diào)用封裝成異步操作(accept, recv, send等),配合IO協(xié)程調(diào)度能夠極大的提升服務(wù)器性能。Http模塊,封裝了sokcet常用方法,支持http協(xié)議解析,客戶端實(shí)現(xiàn)連接池發(fā)送請(qǐng)求,服務(wù)器端實(shí)現(xiàn)servlet模式處理客戶端請(qǐng)求,支持單Reator多線程,多Reator多線程模式的服務(wù)器。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-405335.html

Socket模塊

1. 主要功能

  • 對(duì)Linux下socket相關(guān)方法的封裝,包括bind、listen、connect、read/write系列等方法。
  • 支持快速創(chuàng)建TCP、UDP對(duì)應(yīng)的Socket。

2. 功能演示

  • 模擬一個(gè)請(qǐng)求百度的客戶端,并打印出響應(yīng)
IPAddress::ptr addr = Address::LookupAnyIPAddress("www.baidu.com:80");
// 創(chuàng)建socket
Socket::ptr socket = Socket::CreateTCP(addr);
// 連接
socket->connect(addr);
//發(fā)送數(shù)據(jù)
const char buf[] = "GET / HTTP/1.1\r\n\r\n";
int rt = socket->send(buf, sizeof(buf));
if(rt <= 0) {
    LOG_INFO(g_logger) << "send fail";
    return;
}

//接收數(shù)據(jù)
std::string buffers;
buffers.resize(4096);
rt = socket->recv(&buffers[0], 4096);
if(rt <= 0) {
    LOG_INFO(g_logger) << "recv fail";
    return;
}

LOG_INFO(g_logger) << buffers;

3. 模塊介紹

3.1 Socket

  • 對(duì)socket相關(guān)方法的封裝,包括以下內(nèi)容
    • 創(chuàng)建各種類型的套接字對(duì)象的方法(TCP套接字,UDP套接字,Unix域套接字)
    • 設(shè)置套接字選項(xiàng),比如超時(shí)參數(shù)
    • bind/connect/listen方法,實(shí)現(xiàn)綁定地址、發(fā)起連接、發(fā)起監(jiān)聽(tīng)功能
    • accept方法,返回連入的套接字對(duì)象
    • 發(fā)送、接收數(shù)據(jù)的方法
    • 獲取本地地址、遠(yuǎn)端地址的方法
    • 獲取套接字類型、地址類型、協(xié)議類型的方法
    • 取消套接字讀、寫的方法
    class Socket : public std::enable_shared_from_this<Socket>, Noncopyable
    {
    public:
        typedef std::shared_ptr<Socket> ptr;
        typedef std::weak_ptr<Socket> weak_ptr;

		// 創(chuàng)建TCP Socket(滿足地址類型)
        static Socket::ptr CreateTCP(johnsonli::Address::ptr address);
 		// 創(chuàng)建UDP Socket(滿足地址類型)
        static Socket::ptr CreateUDP(johnsonli::Address::ptr address);
		// 創(chuàng)建IPv4的TCP Socket
        static Socket::ptr CreateTCPSocket();
		// 創(chuàng)建IPv4的UDP Socket
        static Socket::ptr CreateUDPSocket();
  		// 創(chuàng)建IPv6的TCP Socket
        static Socket::ptr CreateTCPSocket6();
		// 創(chuàng)建IPv6的UDP Socket
        static Socket::ptr CreateUDPSocket6();

        Socket(int family, int type, int protocol = 0);
        virtual ~Socket();

		
        int64_t getSendTimeout();			// 獲取發(fā)送超時(shí)時(shí)間(毫秒)
        void setSendTimeout(int64_t v);		// 設(shè)置發(fā)送超時(shí)時(shí)間(毫秒)
        int64_t getRecvTimeout();			// 獲取接受超時(shí)時(shí)間(毫秒)
        void setRecvTimeout(int64_t v);		// 設(shè)置接受超時(shí)時(shí)間(毫秒)

    	// 獲取sockopt @see getsockopt
        bool getOption(int level, int option, void* result, socklen_t* len);

    	// 獲取sockopt模板 @see getsockopt
        template<class T>
        bool getOption(int level, int option, T& result) 
        {
            socklen_t length = sizeof(T);
            return getOption(level, option, &result, &length);
        }

  		// 設(shè)置sockopt @see setsockopt
        bool setOption(int level, int option, const void* result, socklen_t len);

   		// 設(shè)置sockopt模板 @see setsockopt
        template<class T>
        bool setOption(int level, int option, const T& value) 
        {
            return setOption(level, option, &value, sizeof(T));
        }

        /**
         * @brief 接收connect鏈接
         * @return 成功返回新連接的socket,失敗返回nullptr
         * @pre Socket必須 bind , listen  成功
         */
        virtual Socket::ptr accept();

        /**
         * @brief 綁定地址
         * @param[in] addr 地址
         * @return 是否綁定成功
         */
        virtual bool bind(const Address::ptr addr);

        /**
         * @brief 連接地址
         * @param[in] addr 目標(biāo)地址
         * @param[in] timeout_ms 超時(shí)時(shí)間(毫秒)
         */
        virtual bool connect(const Address::ptr addr, uint64_t timeout_ms = -1);

        virtual bool reconnect(uint64_t timeout_ms = -1);

        /**
         * @brief 監(jiān)聽(tīng)socket
         * @param[in] backlog 未完成連接隊(duì)列的最大長(zhǎng)度
         * @result 返回監(jiān)聽(tīng)是否成功
         * @pre 必須先 bind 成功
         */
        virtual bool listen(int backlog = SOMAXCONN);

        /**
         * @brief 關(guān)閉socket
         */
        virtual bool close();

        /**
         * @brief 發(fā)送數(shù)據(jù)
         * @param[in] buffer 待發(fā)送數(shù)據(jù)的內(nèi)存
         * @param[in] length 待發(fā)送數(shù)據(jù)的長(zhǎng)度
         * @param[in] flags 標(biāo)志字
         * @return
         *      @retval >0 發(fā)送成功對(duì)應(yīng)大小的數(shù)據(jù)
         *      @retval =0 socket被關(guān)閉
         *      @retval <0 socket出錯(cuò)
         */
        virtual int send(const void* buffer, size_t length, int flags = 0);

        /**
         * @brief 發(fā)送數(shù)據(jù)
         * @param[in] buffers 待發(fā)送數(shù)據(jù)的內(nèi)存(iovec數(shù)組)
         * @param[in] length 待發(fā)送數(shù)據(jù)的長(zhǎng)度(iovec長(zhǎng)度)
         * @param[in] flags 標(biāo)志字
         * @return
         *      @retval >0 發(fā)送成功對(duì)應(yīng)大小的數(shù)據(jù)
         *      @retval =0 socket被關(guān)閉
         *      @retval <0 socket出錯(cuò)
         */
        virtual int send(const iovec* buffers, size_t length, int flags = 0);

        /**
         * @brief 發(fā)送數(shù)據(jù)
         * @param[in] buffer 待發(fā)送數(shù)據(jù)的內(nèi)存
         * @param[in] length 待發(fā)送數(shù)據(jù)的長(zhǎng)度
         * @param[in] to 發(fā)送的目標(biāo)地址
         * @param[in] flags 標(biāo)志字
         * @return
         *      @retval >0 發(fā)送成功對(duì)應(yīng)大小的數(shù)據(jù)
         *      @retval =0 socket被關(guān)閉
         *      @retval <0 socket出錯(cuò)
         */
        virtual int sendTo(const void* buffer, size_t length, const Address::ptr to, int flags = 0);

        /**
         * @brief 發(fā)送數(shù)據(jù)
         * @param[in] buffers 待發(fā)送數(shù)據(jù)的內(nèi)存(iovec數(shù)組)
         * @param[in] length 待發(fā)送數(shù)據(jù)的長(zhǎng)度(iovec長(zhǎng)度)
         * @param[in] to 發(fā)送的目標(biāo)地址
         * @param[in] flags 標(biāo)志字
         * @return
         *      @retval >0 發(fā)送成功對(duì)應(yīng)大小的數(shù)據(jù)
         *      @retval =0 socket被關(guān)閉
         *      @retval <0 socket出錯(cuò)
         */
        virtual int sendTo(const iovec* buffers, size_t length, const Address::ptr to, int flags = 0);

        /**
         * @brief 接受數(shù)據(jù)
         * @param[out] buffer 接收數(shù)據(jù)的內(nèi)存
         * @param[in] length 接收數(shù)據(jù)的內(nèi)存大小
         * @param[in] flags 標(biāo)志字
         * @return
         *      @retval >0 接收到對(duì)應(yīng)大小的數(shù)據(jù)
         *      @retval =0 socket被關(guān)閉
         *      @retval <0 socket出錯(cuò)
         */
        virtual int recv(void* buffer, size_t length, int flags = 0);

        /**
         * @brief 接受數(shù)據(jù)
         * @param[out] buffers 接收數(shù)據(jù)的內(nèi)存(iovec數(shù)組)
         * @param[in] length 接收數(shù)據(jù)的內(nèi)存大小(iovec數(shù)組長(zhǎng)度)
         * @param[in] flags 標(biāo)志字
         * @return
         *      @retval >0 接收到對(duì)應(yīng)大小的數(shù)據(jù)
         *      @retval =0 socket被關(guān)閉
         *      @retval <0 socket出錯(cuò)
         */
        virtual int recv(iovec* buffers, size_t length, int flags = 0);

        /**
         * @brief 接受數(shù)據(jù)
         * @param[out] buffer 接收數(shù)據(jù)的內(nèi)存
         * @param[in] length 接收數(shù)據(jù)的內(nèi)存大小
         * @param[out] from 發(fā)送端地址
         * @param[in] flags 標(biāo)志字
         * @return
         *      @retval >0 接收到對(duì)應(yīng)大小的數(shù)據(jù)
         *      @retval =0 socket被關(guān)閉
         *      @retval <0 socket出錯(cuò)
         */
        virtual int recvFrom(void* buffer, size_t length, Address::ptr from, int flags = 0);

        /**
         * @brief 接受數(shù)據(jù)
         * @param[out] buffers 接收數(shù)據(jù)的內(nèi)存(iovec數(shù)組)
         * @param[in] length 接收數(shù)據(jù)的內(nèi)存大小(iovec數(shù)組長(zhǎng)度)
         * @param[out] from 發(fā)送端地址
         * @param[in] flags 標(biāo)志字
         * @return
         *      @retval >0 接收到對(duì)應(yīng)大小的數(shù)據(jù)
         *      @retval =0 socket被關(guān)閉
         *      @retval <0 socket出錯(cuò)
         */
        virtual int recvFrom(iovec* buffers, size_t length, Address::ptr from, int flags = 0);



		// 輸出信息到流中
        virtual std::ostream& dump(std::ostream& os) const;
        virtual std::string toString() const;


        bool cancelRead();		// 取消讀
        bool cancelWrite();		// 取消寫	
        bool cancelAccept();	// 取消accept
        bool cancelAll();		// 取消所有事件

    protected:
        void initSock();				// 設(shè)置socket屬性
        void newSock();					// 創(chuàng)建socket m_sockfd = socket()
        virtual bool init(int sock);	// 初始化sock,調(diào)用initSock

    protected:  
        int m_sockfd;						/// socket句柄        
        int m_family;						/// 協(xié)議簇        
        int m_type;							/// 類型       
        int m_protocol;						/// 協(xié)議        
        bool m_isConnected;					/// 是否連接        
        Address::ptr m_localAddress;		/// 本地地址   
        Address::ptr m_remoteAddress;   	/// 遠(yuǎn)端地址
    };
	
	// 流式輸出socket
    std::ostream& operator<<(std::ostream& os, const Socket& sock);
}

到了這里,關(guān)于從零開(kāi)始實(shí)現(xiàn)一個(gè)C++高性能服務(wù)器框架----Socket模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++高性能服務(wù)器網(wǎng)絡(luò)框架設(shè)計(jì)與實(shí)現(xiàn)

    C++高性能服務(wù)器網(wǎng)絡(luò)框架設(shè)計(jì)與實(shí)現(xiàn)

    這篇文章將從兩個(gè)方面來(lái)介紹,一個(gè)是服務(wù)器中的基礎(chǔ)的網(wǎng)絡(luò)通信部件;另外一個(gè)是,如何利用這些基礎(chǔ)通信部件整合成一個(gè)完整的高效的服務(wù)器框架。注意:本文以下內(nèi)容中的客戶端是相對(duì)概念,指的是連接到當(dāng)前討論的服務(wù)程序的終端,所以這里的客戶端既可能是我們傳

    2024年02月04日
    瀏覽(22)
  • c++代碼實(shí)現(xiàn)一個(gè)高性能內(nèi)存池(超詳細(xì)版本)

    c++代碼實(shí)現(xiàn)一個(gè)高性能內(nèi)存池(超詳細(xì)版本)

    寫在前面 本文的內(nèi)存池代碼是改編自Nginx的內(nèi)存池源碼,思路幾乎一樣。由于Nginx源碼的變量命名我不喜歡,又沒(méi)有注釋,看得我很難受。想自己寫一版容易理解的代碼。這應(yīng)該是全網(wǎng)獨(dú)一份的超詳細(xì)版本了(笑~). 應(yīng)用場(chǎng)景 寫內(nèi)存池的原理之前,按照慣例先說(shuō)內(nèi)存池的應(yīng)用

    2024年02月06日
    瀏覽(33)
  • 云原生 | 從零開(kāi)始,Minio 高性能分布式對(duì)象存儲(chǔ)快速入手指南

    云原生 | 從零開(kāi)始,Minio 高性能分布式對(duì)象存儲(chǔ)快速入手指南

    [ 點(diǎn)擊 ?? 關(guān)注「 全棧工程師修煉指南」公眾號(hào) ] 希望各位看友多多支持【關(guān)注、點(diǎn)贊、評(píng)論、收藏、投幣】,助力每一個(gè)夢(mèng)想。 【 WeiyiGeek Blog\\\'s - 花開(kāi)堪折直須折,莫待無(wú)花空折枝 ?】 作者主頁(yè): 【?https://weiyigeek.top 】 博客地址: 【?https://blog.weiyigeek.top?】 作者答疑學(xué)習(xí)交

    2024年02月08日
    瀏覽(31)
  • 一、C++項(xiàng)目:仿muduo庫(kù)實(shí)現(xiàn)高性能高并發(fā)服務(wù)器

    一、C++項(xiàng)目:仿muduo庫(kù)實(shí)現(xiàn)高性能高并發(fā)服務(wù)器

    仿mudou庫(kù)one thread oneloop式并發(fā)服務(wù)器實(shí)現(xiàn) 仿muduo庫(kù)One Thread One Loop式主從Reactor模型實(shí)現(xiàn)高并發(fā)服務(wù)器: 通過(guò)實(shí)現(xiàn)的高并發(fā)服務(wù)器組件,可以簡(jiǎn)潔快速的完成一個(gè)高性能的服務(wù)器搭建。并且,通過(guò)組件內(nèi)提供的不同應(yīng)用層協(xié)議支持,也可以快速完成一個(gè)高性能應(yīng)用服務(wù)器的搭建

    2024年02月07日
    瀏覽(34)
  • Nginx - ?一個(gè)高性能、靈活可靠的開(kāi)源Web服務(wù)器

    Nginx - ?一個(gè)高性能、靈活可靠的開(kāi)源Web服務(wù)器

    Nginx是什么? ??Nginx是一個(gè) 高性能的HTTP和反向代理web服務(wù)器 ,同時(shí)也提供了IMAP/POP3/SMTP服務(wù)。Nginx是由伊戈?duì)枴べ愃饕驗(yàn)槎砹_斯訪問(wèn)量第二的Rambler.ru站點(diǎn)(俄文:Рамблер)開(kāi)發(fā)的,第一個(gè)公開(kāi)版本0.1.0發(fā)布于2004年10月4日。2011年6月1日,nginx 1.0.4發(fā)布。 ??特點(diǎn)是 占有

    2024年02月07日
    瀏覽(29)
  • [AIGC] Nginx:一個(gè)高性能的 Web 服務(wù)器和反向代理

    Nginx(engine x)是一個(gè)高性能的 Web 服務(wù)器和反向代理,它由 Igor Sysoev 于 2002 年開(kāi)發(fā),并于 2004 年首次發(fā)布為開(kāi)源軟件。Nginx 是當(dāng)今最受歡迎的 Web 服務(wù)器之一,它在互聯(lián)網(wǎng)上被廣泛使用,支持 millions 個(gè)網(wǎng)站和應(yīng)用程序。 Nginx 是一個(gè)免費(fèi)、開(kāi)源、高性能的 Web 服務(wù)器和反向代理

    2024年02月20日
    瀏覽(27)
  • c++高性能264/265實(shí)時(shí)h5流媒體服務(wù)器前后端整體解決方案

    c++高性能264/265實(shí)時(shí)h5流媒體服務(wù)器前后端整體解決方案

    c++高性能264/265實(shí)時(shí)h5流媒體服務(wù)器前后端整體解決方案 下圖展示了前端播放效果。 播放1路264視頻流,4路265視頻流 CPU占用率10%(測(cè)試機(jī)器上運(yùn)行著c++服務(wù)端和其他工具程序) GPU0占用率17% 1.1 作者測(cè)試機(jī)器配置 處理器 11th Gen Intel? Core? i7-11800H @ 2.30GHz 2.30 GHz 機(jī)帶 RAM 32.0 GB (31.

    2024年02月12日
    瀏覽(21)
  • cpp-httplib: 輕量級(jí)、高性能的C++ HTTP/HTTPS客戶端和服務(wù)器庫(kù)

    cpp-httplib 是一個(gè)輕量級(jí)且高效的 C++ HTTP/HTTPS 客戶端和服務(wù)器庫(kù)。它由 Hideaki Sone(yhirose)開(kāi)發(fā),并在 MIT 許可下發(fā)布。該項(xiàng)目的主要目標(biāo)是提供一種簡(jiǎn)單易用的方式,在 C++ 應(yīng)用程序中實(shí)現(xiàn) HTTP 和 HTTPS 功能。 項(xiàng)目倉(cāng)庫(kù)地址:https://gitcode.com/yhirose/cpp-httplib cpp-httplib 可用于以下場(chǎng)

    2024年04月09日
    瀏覽(87)
  • 多路轉(zhuǎn)接高性能IO服務(wù)器|select|poll|epoll|模型詳細(xì)實(shí)現(xiàn)

    多路轉(zhuǎn)接高性能IO服務(wù)器|select|poll|epoll|模型詳細(xì)實(shí)現(xiàn)

    那么這里博主先安利一下一些干貨滿滿的專欄啦! Linux專欄 https://blog.csdn.net/yu_cblog/category_11786077.html?spm=1001.2014.3001.5482 操作系統(tǒng)專欄 https://blog.csdn.net/yu_cblog/category_12165502.html?spm=1001.2014.3001.5482 手撕數(shù)據(jù)結(jié)構(gòu) https://blog.csdn.net/yu_cblog/category_11490888.html?spm=1001.2014.3001.5482 去倉(cāng)庫(kù)獲

    2024年02月15日
    瀏覽(25)
  • Linux C++性能優(yōu)化秘籍:從編譯器到代碼,探究高性能C++程序的實(shí)現(xiàn)之道

    Linux C++性能優(yōu)化秘籍:從編譯器到代碼,探究高性能C++程序的實(shí)現(xiàn)之道

    隨著大數(shù)據(jù)、人工智能等技術(shù)的飛速發(fā)展,程序性能優(yōu)化的重要性愈發(fā)突出。優(yōu)化性能可以降低資源消耗、提高系統(tǒng)響應(yīng)速度,從而在有限的硬件資源下,實(shí)現(xiàn)更高的吞吐量和處理能力。此外,性能優(yōu)化也有助于降低能耗、減少散熱問(wèn)題,延長(zhǎng)硬件使用壽命。 Linux操作系統(tǒng)具

    2023年04月09日
    瀏覽(46)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包