{"id":360,"date":"2025-09-27T13:07:37","date_gmt":"2025-09-27T05:07:37","guid":{"rendered":"http:\/\/www.tgwttt.xyz\/?p=360"},"modified":"2025-11-24T16:36:34","modified_gmt":"2025-11-24T08:36:34","slug":"tcpsocket%e7%bc%96%e7%a8%8b%e4%bb%8b%e7%bb%8d","status":"publish","type":"post","link":"https:\/\/www.tgwttt.xyz\/?p=360","title":{"rendered":"Tcpsocket\u7f16\u7a0b\u4ecb\u7ecd"},"content":{"rendered":"\n<p>\u4ed3\u5e93\uff1a<a href=\"https:\/\/gitee.com\/tgwTTT\/linux-learning-dai\/tree\/master\/socketTcp\u7801\">https:\/\/gitee.com\/tgwTTT\/linux-learning-dai\/tree\/master\/socketTcp\u7801<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tcpsocket\u4ecb\u7ecd<\/h2>\n\n\n\n<p>TCPSocket \u7f16\u7a0b\u662f Linux \u7f51\u7edc\u5f00\u53d1\u7684\u57fa\u7840\uff0c\u4e3b\u8981\u7528\u4e8e\u5b9e\u73b0\u53ef\u9760\u7684\u7f51\u7edc\u901a\u4fe1\u3002\u670d\u52a1\u7aef\u901a\u8fc7\u76d1\u542c\u7aef\u53e3\uff0c\u7b49\u5f85\u5ba2\u6237\u7aef\u8fde\u63a5\uff0c\u53cc\u65b9\u901a\u8fc7\u5957\u63a5\u5b57\u8fdb\u884c\u6570\u636e\u6536\u53d1\u3002TCP \u534f\u8bae\u4fdd\u8bc1\u4e86\u6570\u636e\u7684\u53ef\u9760\u4f20\u8f93\u548c\u987a\u5e8f\u6027\uff0c\u5e7f\u6cdb\u5e94\u7528\u4e8e Web \u670d\u52a1\u3001\u5373\u65f6\u901a\u8baf\u3001\u6587\u4ef6\u4f20\u8f93\u7b49\u573a\u666f\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TCP \u670d\u52a1\u7aef\u7f16\u7a0b\u6d41\u7a0b<\/h2>\n\n\n\n<p>\u5178\u578b\u7684 TCP \u670d\u52a1\u7aef\u7f16\u7a0b\u6d41\u7a0b\u5305\u62ec\u4ee5\u4e0b\u51e0\u4e2a\u6b65\u9aa4\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u521b\u5efa\u5957\u63a5\u5b57<\/strong><br>\u4f7f\u7528socket\u00a0\u521b\u5efa\u4e00\u4e2a TCP \u5957\u63a5\u5b57\uff0c\u6307\u5b9a\u534f\u8bae\u65cf\uff08\u5982 IPv4\uff09\u548c\u7c7b\u578b\uff08\u6d41\u5f0f\uff09\u3002<\/li>\n\n\n\n<li><strong>\u7ed1\u5b9a\u7aef\u53e3<\/strong><br>\u901a\u8fc7bind\u5c06\u5957\u63a5\u5b57\u7ed1\u5b9a\u5230\u672c\u5730 IP \u548c\u7aef\u53e3\uff0c\u4f7f\u5176\u80fd\u63a5\u6536\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002<\/li>\n\n\n\n<li><strong>\u76d1\u542c\u8fde\u63a5<\/strong><br>\u4f7f\u7528listen\u8ba9\u5957\u63a5\u5b57\u8fdb\u5165\u76d1\u542c\u72b6\u6001\uff0c\u51c6\u5907\u63a5\u53d7\u5ba2\u6237\u7aef\u8fde\u63a5\u3002<\/li>\n\n\n\n<li><strong>\u63a5\u53d7\u8fde\u63a5<\/strong><br>\u901a\u8fc7accept\u00a0\u963b\u585e\u7b49\u5f85\u5ba2\u6237\u7aef\u8fde\u63a5\uff0c\u6bcf\u6709\u4e00\u4e2a\u8fde\u63a5\u5c31\u8fd4\u56de\u4e00\u4e2a\u65b0\u7684\u5957\u63a5\u5b57\u3002<\/li>\n\n\n\n<li><strong>\u6570\u636e\u6536\u53d1<\/strong><br>\u4f7f\u7528read\u548cwrite\u5b9e\u73b0\u4e0e\u5ba2\u6237\u7aef\u7684\u6570\u636e\u4ea4\u4e92\u3002<\/li>\n\n\n\n<li><strong>\u5173\u95ed\u8fde\u63a5<\/strong><br>\u901a\u4fe1\u7ed3\u675f\u540e\uff0c\u5173\u95ed\u5957\u63a5\u5b57\uff0c\u91ca\u653e\u8d44\u6e90\u3002<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u63a5\u53e3\u4ecb\u7ecd\uff1a<\/h2>\n\n\n\n<p><strong>socket():<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"463\" height=\"91\" src=\"http:\/\/www.tgwttt.xyz\/wp-content\/uploads\/2025\/09\/image-36.png\" alt=\"\" class=\"wp-image-361\" srcset=\"https:\/\/www.tgwttt.xyz\/wp-content\/uploads\/2025\/09\/image-36.png 463w, https:\/\/www.tgwttt.xyz\/wp-content\/uploads\/2025\/09\/image-36-300x59.png 300w\" sizes=\"auto, (max-width: 463px) 100vw, 463px\" \/><\/figure>\n\n\n\n<p>socket()\u6253\u5f00\u2f00\u4e2a\u2f79\u7edc\u901a\u8baf\u7aef\u2f1d,\u5982\u679c\u6210\u529f\u7684\u8bdd,\u5c31\u50cfopen()\u2f00\u6837\u8fd4\u56de\u2f00\u4e2a\u2f42\u4ef6\u63cf\u8ff0\u7b26;<\/p>\n\n\n\n<p>\u5e94\u2f64\u7a0b\u5e8f\u53ef\u4ee5\u50cf\u8bfb\u5199\u2f42\u4ef6\u2f00\u6837\u2f64read\/write\u5728\u2f79\u7edc\u4e0a\u6536\u53d1\u6570\u636e;<\/p>\n\n\n\n<p>\u5982\u679csocket()\u8c03\u2f64\u51fa\u9519\u5219\u8fd4\u56de-1; <\/p>\n\n\n\n<p>\u5bf9\u4e8eIPv4, family\u53c2\u6570\u6307\u5b9a\u4e3aAF_INET; <\/p>\n\n\n\n<p>\u5bf9\u4e8eTCP\u534f\u8bae,type\u53c2\u6570\u6307\u5b9a\u4e3aSOCK_STREAM, \u8868\u2f70\u2faf\u5411\u6d41\u7684\u4f20\u8f93\u534f\u8bae <\/p>\n\n\n\n<p><strong>bind()<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"485\" height=\"117\" src=\"http:\/\/www.tgwttt.xyz\/wp-content\/uploads\/2025\/09\/image-37.png\" alt=\"\" class=\"wp-image-362\" srcset=\"https:\/\/www.tgwttt.xyz\/wp-content\/uploads\/2025\/09\/image-37.png 485w, https:\/\/www.tgwttt.xyz\/wp-content\/uploads\/2025\/09\/image-37-300x72.png 300w\" sizes=\"auto, (max-width: 485px) 100vw, 485px\" \/><\/figure>\n\n\n\n<p>\u670d\u52a1\u5668\u7a0b\u5e8f\u6240\u76d1\u542c\u7684\u2f79\u7edc\u5730\u5740\u548c\u7aef\u2f1d\u53f7\u901a\u5e38\u662f\u56fa\u5b9a\u4e0d\u53d8\u7684,\u5ba2\u2f3e\u7aef\u7a0b\u5e8f\u5f97\u77e5\u670d\u52a1\u5668\u7a0b\u5e8f\u7684\u5730\u5740\u548c\u7aef\u2f1d\u53f7\u540e\u5c31\u53ef\u4ee5\u5411\u670d\u52a1\u5668\u53d1\u8d77\u8fde\u63a5; \u670d\u52a1\u5668\u9700\u8981\u8c03\u2f64bind\u7ed1\u5b9a\u2f00\u4e2a\u56fa\u5b9a\u7684\u2f79\u7edc\u5730\u5740\u548c\u7aef\u2f1d\u53f7; <\/p>\n\n\n\n<p>bind()\u6210\u529f\u8fd4\u56de0,\u5931\u8d25\u8fd4\u56de-1\u3002<\/p>\n\n\n\n<p>bind()\u7684\u4f5c\u2f64\u662f\u5c06\u53c2\u6570sockfd\u548cmyaddr\u7ed1\u5b9a\u5728\u2f00\u8d77, \u4f7fsockfd\u8fd9\u4e2a\u2f64\u4e8e\u2f79\u7edc\u901a\u8baf\u7684\u2f42\u4ef6\u63cf\u8ff0\u7b26\u76d1\u542cmyaddr\u6240\u63cf\u8ff0\u7684\u5730\u5740\u548c\u7aef\u2f1d\u53f7; <\/p>\n\n\n\n<p>struct sockaddr *\u662f\u2f00\u4e2a\u901a\u2f64\u6307\u9488\u7c7b\u578b,myaddr\u53c2\u6570\u5b9e\u9645\u4e0a\u53ef\u4ee5\u63a5\u53d7\u591a\u79cd\u534f\u8bae\u7684sockaddr\u7ed3\u6784\u4f53,\u2f7d\u5b83\u4eec\u7684\u2ed3\u5ea6\u5404\u4e0d\u76f8\u540c,\u6240\u4ee5\u9700\u8981\u7b2c\u4e09\u4e2a\u53c2\u6570addrlen\u6307\u5b9a\u7ed3\u6784\u4f53\u7684\u2ed3\u5ea6;<\/p>\n\n\n\n<p><strong>listen<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"451\" height=\"97\" src=\"http:\/\/www.tgwttt.xyz\/wp-content\/uploads\/2025\/09\/image-38.png\" alt=\"\" class=\"wp-image-363\" srcset=\"https:\/\/www.tgwttt.xyz\/wp-content\/uploads\/2025\/09\/image-38.png 451w, https:\/\/www.tgwttt.xyz\/wp-content\/uploads\/2025\/09\/image-38-300x65.png 300w\" sizes=\"auto, (max-width: 451px) 100vw, 451px\" \/><\/figure>\n\n\n\n<p>listen()\u58f0\u660esockfd\u5904\u4e8e\u76d1\u542c\u72b6\u6001, \u5e76\u4e14\u6700\u591a\u5141\u8bb8\u6709backlog\u4e2a\u5ba2\u2f3e\u7aef\u5904\u4e8e\u8fde\u63a5\u7b49\u5f85\u72b6\u6001, \u5982\u679c\u63a5\u6536\u5230\u66f4\u591a\u7684\u8fde\u63a5\u8bf7\u6c42\u5c31\u5ffd\u7565, \u8fd9\u2fa5\u8bbe\u7f6e\u4e0d\u4f1a\u592a\u2f24(\u2f00\u822c\u662f5)<\/p>\n\n\n\n<p> listen()\u6210\u529f\u8fd4\u56de0,\u5931\u8d25\u8fd4\u56de-1;<\/p>\n\n\n\n<p><strong>accept:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"625\" height=\"88\" src=\"http:\/\/www.tgwttt.xyz\/wp-content\/uploads\/2025\/09\/image-39.png\" alt=\"\" class=\"wp-image-364\" srcset=\"https:\/\/www.tgwttt.xyz\/wp-content\/uploads\/2025\/09\/image-39.png 625w, https:\/\/www.tgwttt.xyz\/wp-content\/uploads\/2025\/09\/image-39-300x42.png 300w\" sizes=\"auto, (max-width: 625px) 100vw, 625px\" \/><\/figure>\n\n\n\n<p>\u4e09\u6b21\u63e1\u2f3f\u5b8c\u6210\u540e, \u670d\u52a1\u5668\u8c03\u2f64accept()\u63a5\u53d7\u8fde\u63a5; <\/p>\n\n\n\n<p>\u5982\u679c\u670d\u52a1\u5668\u8c03\u2f64accept()\u65f6\u8fd8\u6ca1\u6709\u5ba2\u2f3e\u7aef\u7684\u8fde\u63a5\u8bf7\u6c42,\u5c31\u963b\u585e\u7b49\u5f85\u76f4\u5230\u6709\u5ba2\u2f3e\u7aef\u8fde\u63a5\u4e0a\u6765; <\/p>\n\n\n\n<p>addr\u662f\u2f00\u4e2a\u4f20\u51fa\u53c2\u6570,accept()\u8fd4\u56de\u65f6\u4f20\u51fa\u5ba2\u2f3e\u7aef\u7684\u5730\u5740\u548c\u7aef\u2f1d\u53f7; \u2022 \u5982\u679c\u7ed9addr \u53c2\u6570\u4f20NULL,\u8868\u2f70\u4e0d\u5173\u2f3c\u5ba2\u2f3e\u7aef\u7684\u5730\u5740;<\/p>\n\n\n\n<p> addrlen\u53c2\u6570\u662f\u2f00\u4e2a\u4f20\u2f0a\u4f20\u51fa\u53c2\u6570(value-result argument), \u4f20\u2f0a\u7684\u662f\u8c03\u2f64\u8005\u63d0\u4f9b\u7684, \u7f13\u51b2\u533aaddr\u7684\u2ed3\u5ea6\u4ee5\u907f\u514d\u7f13\u51b2\u533a\u6ea2\u51fa\u95ee\u9898, \u4f20\u51fa\u7684\u662f\u5ba2\u2f3e\u7aef\u5730\u5740\u7ed3\u6784\u4f53\u7684\u5b9e\u9645\u2ed3\u5ea6(\u6709\u53ef\u80fd\u6ca1\u6709\u5360\u6ee1\u8c03\u2f64\u8005\u63d0\u4f9b\u7684\u7f13\u51b2\u533a);<\/p>\n\n\n\n<p><strong>connect<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"529\" height=\"122\" src=\"http:\/\/www.tgwttt.xyz\/wp-content\/uploads\/2025\/09\/image-40.png\" alt=\"\" class=\"wp-image-365\" srcset=\"https:\/\/www.tgwttt.xyz\/wp-content\/uploads\/2025\/09\/image-40.png 529w, https:\/\/www.tgwttt.xyz\/wp-content\/uploads\/2025\/09\/image-40-300x69.png 300w\" sizes=\"auto, (max-width: 529px) 100vw, 529px\" \/><\/figure>\n\n\n\n<p>\u5ba2\u2f3e\u7aef\u9700\u8981\u8c03\u2f64connect()\u8fde\u63a5\u670d\u52a1\u5668; <\/p>\n\n\n\n<p>connect\u548cbind\u7684\u53c2\u6570\u5f62\u5f0f\u2f00\u81f4, \u533a\u522b\u5728\u4e8ebind\u7684\u53c2\u6570\u662f\u2f83\u2f30\u7684\u5730\u5740, \u2f7dconnect\u7684\u53c2\u6570\u662f\u5bf9\u2f45\u7684\u5730\u5740; <\/p>\n\n\n\n<p>connect()\u6210\u529f\u8fd4\u56de0,\u51fa\u9519\u8fd4\u56de-1;<\/p>\n\n\n\n<p><strong>\u7b80\u5355\u7684echosever\u4e3e\u4f8b:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>namespace Tcp\n{\n    class Tcpsocket;\n    using task_t = std::function<void()>;\n    const int max_thread_num=10;\n    class ThreadData{\n        public:\n            ThreadData(int sockfd,NetAddr clientaddr,Tcpsocket* tcpsocket):sockfd(sockfd),tcpsocket(tcpsocket),clientaddr(clientaddr){}\n        public:\n            int sockfd;\n            NetAddr clientaddr;\n            Tcpsocket* tcpsocket;\n    };\n    class Tcpsocket : NoCopy\n    {\n    public:\n        Tcpsocket(uint16_t port) : _isrunning(false), _listenfd(-1), _port(port) {}\n        ~Tcpsocket() {}\n        void Service(int sockfd, NetAddr clientaddr)\n    {\n        char buf[1024];\n        while (true)\n        {\n            memset(buf, 0, sizeof(buf));\n            int n = read(sockfd, buf, sizeof(buf));\n            if (n <= 0){\n                LOG(LogLevel::INFO) << \"client \" << clientaddr.stringaddr() << \" disconnected\";\n                break;\n            }\n            buf[n] = 0;\n            LOG(LogLevel::INFO) << \"#\"<<buf;\n            write(sockfd, buf, n);\n        }\n    }\n        void Start()\n        {\n            _listenfd = socket(AF_INET, SOCK_STREAM, 0);\n            if (_listenfd < 0)\n            {\n                LOG(LogLevel::ERROR) << \"create socket failed\";\n                return;\n            }\n            LOG(LogLevel::INFO) << \"create socket success\";\n            \/\/ bind socket\n            _listenaddr.setAddr(_port);\n            int ret = bind(_listenfd, (struct sockaddr *)&#038;_listenaddr.getAddr(), sizeof(_listenaddr.getAddr()));\n            if (ret < 0)\n            {\n                LOG(LogLevel::ERROR) << \"bind socket failed\";\n                return;\n            }\n            LOG(LogLevel::INFO) << \"bind socket success\";\n            \/\/ listen socket\n            int rets = listen(_listenfd, 10);\n            if (rets < 0)\n            {\n                LOG(LogLevel::ERROR) << \"listen socket failed\";\n                return;\n            }\n            LOG(LogLevel::INFO) << \"listen socket success\";\n        }\n        static void*Rountine(void* arg){\n            pthread_detach(pthread_self());\n            ThreadData* data=(ThreadData*)arg;\n            data->tcpsocket->Service(data->sockfd,data->clientaddr);\n            delete data;\n            return nullptr;\n        }\n        void Run()\n        {\n            _isrunning = true;\n            while (_isrunning)\n            {\n                sleep(1);\n                \/\/ \u83b7\u53d6\u8fde\u63a5\n                struct sockaddr_in peer;\n                socklen_t clientlen = sizeof(peer);\n                int connfd = accept(_listenfd, (struct sockaddr *)&peer, &clientlen);\n                if (connfd < 0)\n                {\n                    LOG(LogLevel::ERROR) << \"accept socket failed\";\n                    continue;\n                }\n                NetAddr clientaddr(peer);\n                LOG(LogLevel::INFO) << \"accept socket success\" << clientaddr.stringaddr();\n                \/\/ \u5904\u7406\u94fe\u63a5\n            \/\/     pid_t id = fork();\n            \/\/     if (id < 0)\n            \/\/     {\n            \/\/         LOG(LogLevel::FATAL) << \"fork eeror\";\n            \/\/         exit(1);\n            \/\/     }\n            \/\/     else if (id == 0)\n            \/\/     {\n            \/\/         \/\/ \u5b50\u8fdb\u7a0b\n            \/\/         \/\/ \u6211\u4eec\u4e0d\u60f3\u8ba9\u5b50\u8fdb\u7a0b\u8bbf\u95eelisten\u5957\u63a5\u5b57\n            \/\/         close(_listenfd);\n            \/\/         if (fork() > 0)\n            \/\/         { \/\/ \u518d\u6b21fork,\u5b50\u8fdb\u7a0b\u9000\u51fa\n            \/\/             exit(0);\n            \/\/         }\n            \/\/         Service(connfd, clientaddr); \/\/ \u5b64\u513f\u8fdb\u7a0b,\u7cfb\u7edf\u56de\u6536\n            \/\/         exit(0);\n            \/\/     }\n            \/\/     else\n            \/\/     {\n            \/\/         \/\/ \u7236\u8fdb\u7a0b\n            \/\/         close(connfd);\n            \/\/         int rid = waitpid(id, nullptr, 0);\n            \/\/         \/\/ \u7236\u8fdb\u7a0b\n            \/\/         (void)rid;\n            \/\/     }\n            ThreadData *data=new ThreadData(_listenfd,_listenaddr,this);\n            pthread_t tid;\n            pthread_create(&tid, nullptr,Rountine,data);\n            \/\/\u7ebf\u7a0b\u6c60\u7248\u9002\u5408\u77ed\u670d\u52a1\n        \/\/    ThreadPool<task_t> pool(max_thread_num);\n        \/\/     pool.Enqueue([this,&connfd,&clientaddr](){\n        \/\/         Service(connfd, clientaddr);\n        \/\/     });\n        }\n            _isrunning = false;\n    }\n        void Stop()\n        {\n            this->_isrunning = false;\n        }\n\n    public:\n        bool _isrunning;\n        int _listenfd;\n        NetAddr _listenaddr;\n        uint16_t _port;\n    };\n}<\/code><\/pre>\n\n\n\n<p><strong>client:<\/strong><\/p>\n\n\n\n<p>void Usage(std::<em>string<\/em> <em>argv<\/em>){<\/p>\n\n\n\n<p>\u00a0 \u00a0 std::cout<<\"Usage: \"<<<em>argv<\/em><<\" <server ip> <server port>&#8220;<<std::endl;<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>int main(int <em>argc<\/em>,char*<em>argv<\/em>[]){<\/p>\n\n\n\n<p>\u00a0 \u00a0 if(<em>argc<\/em><3){<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 Usage(<em>argv<\/em>[0]);<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 return 1;<\/p>\n\n\n\n<p>\u00a0 \u00a0 }<\/p>\n\n\n\n<p>\u00a0 \u00a0 if(<em>argc<\/em>>3){<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 LOG(<em>LogLevel<\/em>::WARNING)<<\"\u53c2\u6570\u8fc7\u591a\";<\/p>\n\n\n\n<p>\u00a0 \u00a0 }<\/p>\n\n\n\n<p>\u00a0 \u00a0 int sockfd=socket(AF_INET,SOCK_STREAM,0);<\/p>\n\n\n\n<p>\u00a0 \u00a0 if(sockfd<0){<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 LOG(<em>LogLevel<\/em>::ERROR)<<\"Socket creation failed\";<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 return 1;<\/p>\n\n\n\n<p>\u00a0 \u00a0 }<\/p>\n\n\n\n<p>\u00a0 \u00a0 \/\/bind,\u4e0d\u9700\u8981\u663e\u793a\u7ed1\u5b9a\u4e5f\u4e0d\u9700\u8981\u76d1\u542c<\/p>\n\n\n\n<p>\u00a0 \u00a0 std::<em>string<\/em> serverip=<em>argv<\/em>[1];<\/p>\n\n\n\n<p>\u00a0 \u00a0 <em>uint16_t<\/em> serverport=std::stoi(<em>argv<\/em>[2]);<\/p>\n\n\n\n<p>\u00a0 \u00a0 \/\/\u76f4\u63a5\u53d1\u8d77\u8fde\u63a5\u8bf7\u6c42,\u8bf7\u6c42\u6210\u529f\u540e\u4f1a\u81ea\u52a8\u53d1\u8d77\u7ed1\u5b9a<\/p>\n\n\n\n<p>\u00a0 \u00a0 <em>NetAddr<\/em> peer(serverip,serverport);<\/p>\n\n\n\n<p>\u00a0 \u00a0 if(connect(sockfd,(struct <em>sockaddr<\/em>*)&#038;peer.getAddr(),sizeof(peer.getAddr()))<0){<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 LOG(<em>LogLevel<\/em>::ERROR)<<\"Connect failed\";<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 return 1;<\/p>\n\n\n\n<p>\u00a0 \u00a0 }<\/p>\n\n\n\n<p>\u00a0 \u00a0 while(true){<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 std::<em>string<\/em> line;<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 std::cout<<\"#please Enter message:\"<<std::endl;<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 std::getline(std::cin,line);<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 if(line==&#8221;quit&#8221;){<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 break;<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 }<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 write(sockfd,line.c_str(),line.size());<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 char recvbuf[1024];<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 int recvlen=read(sockfd,recvbuf,1024);<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 if(recvlen<0){<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 LOG(<em>LogLevel<\/em>::ERROR)<<\"Read failed\";<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 1;<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 }<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 std::cout<<\"Recv:\"<<recvbuf<<std::endl;<\/p>\n\n\n\n<p>\u00a0 \u00a0 }<\/p>\n\n\n\n<p>\u00a0 \u00a0 close(sockfd);<\/p>\n\n\n\n<p>\u00a0 \u00a0 return 0;<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TCP \u4e0e UDP Socket \u7f16\u7a0b\u5bf9\u6bd4<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u7279\u6027<\/th><th>TCP Socket<\/th><th>UDP Socket<\/th><\/tr><\/thead><tbody><tr><td>\u662f\u5426\u8fde\u63a5<\/td><td>\u9762\u5411\u8fde\u63a5\uff08\u9700\u4e09\u6b21\u63e1\u624b\uff09<\/td><td>\u65e0\u8fde\u63a5\uff08\u65e0\u9700\u5efa\u7acb\u8fde\u63a5\uff09<\/td><\/tr><tr><td>\u53ef\u9760\u6027<\/td><td>\u53ef\u9760\uff0c\u4fdd\u8bc1\u987a\u5e8f\u548c\u5b8c\u6574\u6027<\/td><td>\u4e0d\u53ef\u9760\uff0c\u53ef\u80fd\u4e22\u5305\u3001\u4e71\u5e8f<\/td><\/tr><tr><td>\u4f20\u8f93\u65b9\u5f0f<\/td><td>\u5b57\u8282\u6d41\uff0c\u9002\u5408\u5927\u6570\u636e\u91cf\u4f20\u8f93<\/td><td>\u6570\u636e\u62a5\uff0c\u9002\u5408\u77ed\u6d88\u606f\u3001\u5e7f\u64ad<\/td><\/tr><tr><td>\u7f16\u7a0b\u6d41\u7a0b<\/td><td>\u9700\u76d1\u542c\u3001accept\u3001\u6536\u53d1\u3001\u5173\u95ed<\/td><td>\u76f4\u63a5\u6536\u53d1\uff0c\u65e0\u9700\u76d1\u542c\u548c accept<\/td><\/tr><tr><td>\u5e76\u53d1\u5904\u7406<\/td><td>\u901a\u5e38\u9700\u591a\u7ebf\u7a0b\/\u8fdb\u7a0b\u6216\u5f02\u6b65\u6a21\u578b<\/td><td>\u76f4\u63a5\u5904\u7406\uff0c\u6bcf\u4e2a\u6570\u636e\u62a5\u72ec\u7acb<\/td><\/tr><tr><td>\u5e94\u7528\u573a\u666f<\/td><td>Web\u670d\u52a1\u5668\u3001\u6587\u4ef6\u4f20\u8f93\u3001IM<\/td><td>DNS\u3001\u89c6\u9891\u6d41\u3001\u5b9e\u65f6\u6e38\u620f\u3001\u5e7f\u64ad<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>UDP \u670d\u52a1\u7aef\u6d41\u7a0b\u7b80\u8ff0\uff1a<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u521b\u5efa\u5957\u63a5\u5b57\uff1a<code>socket(AF_INET, SOCK_DGRAM, 0)<\/code><\/li>\n\n\n\n<li>\u7ed1\u5b9a\u7aef\u53e3\uff1abind()<\/li>\n\n\n\n<li>\u63a5\u6536\u6570\u636e\uff1a<code>recvfrom()<\/code><\/li>\n\n\n\n<li>\u53d1\u9001\u6570\u636e\uff1a<code>sendto()<\/code><\/li>\n\n\n\n<li>\u65e0\u9700\u76d1\u542c\u548c accept\uff0c\u6570\u636e\u62a5\u72ec\u7acb\u5904\u7406\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u4eca\u5929\u7684\u6587\u7ae0\u5c31\u66f4\u65b0\u5230\u8fd9\uff0c\u5982\u6709\u9519\u8bef\u6b22\u8fce\u6307\u51fa\uff01\uff01\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4ed3\u5e93\uff1ahttps:\/\/gitee.com\/tgwTTT\/linux-learning-dai\/tree\/mas&#8230;<\/p>\n","protected":false},"author":1,"featured_media":361,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[4,5,7],"tags":[],"class_list":["post-360","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-linux","category-7"],"_links":{"self":[{"href":"https:\/\/www.tgwttt.xyz\/index.php?rest_route=\/wp\/v2\/posts\/360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tgwttt.xyz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tgwttt.xyz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tgwttt.xyz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tgwttt.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=360"}],"version-history":[{"count":4,"href":"https:\/\/www.tgwttt.xyz\/index.php?rest_route=\/wp\/v2\/posts\/360\/revisions"}],"predecessor-version":[{"id":836,"href":"https:\/\/www.tgwttt.xyz\/index.php?rest_route=\/wp\/v2\/posts\/360\/revisions\/836"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.tgwttt.xyz\/index.php?rest_route=\/wp\/v2\/media\/361"}],"wp:attachment":[{"href":"https:\/\/www.tgwttt.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tgwttt.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tgwttt.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}