{"id":432,"date":"2019-12-06T10:06:28","date_gmt":"2019-12-06T02:06:28","guid":{"rendered":"http:\/\/www.inhhh.com\/blog\/?p=432"},"modified":"2019-12-06T18:26:41","modified_gmt":"2019-12-06T10:26:41","slug":"linux%e4%b8%8b%e7%9a%84c-socket%e7%bc%96%e7%a8%8b%e5%ae%9e%e4%be%8b","status":"publish","type":"post","link":"http:\/\/www.inhhh.com\/blog\/?p=432","title":{"rendered":"Linux\u4e0b\u7684C++ socket\u7f16\u7a0b\u5b9e\u4f8b"},"content":{"rendered":"\n<p>\u9605\u8bfb\u76ee\u5f55<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u3000\u3000\u57fa\u672c\u7684\u5c40\u57df\u7f51\u804a\u5929<\/li><li>\u3000\u3000\u5ba2\u6237\u7aef\u670d\u52a1\u7aef\u53cc\u5411\u5f02\u6b65\u804a\u5929\u6e90\u7801<\/li><li>\u3000\u3000\u5c40\u57df\u7f51\u5185\u670d\u52a1\u7aef\u548c\u6709\u9650\u4e2a\u5ba2\u6237\u7aef\u804a\u5929\u6e90\u7801<\/li><li>\u3000\u3000\u5b8c\u7f8e\u5f02\u6b65\u804a\u5929\u670d\u52a1\u7aef\u548c\u5ba2\u6237\u7aef\u6e90\u7801<\/li><li>\u3000\u3000C++\u5b9a\u65f6\u5668<\/li><li>\u3000\u3000select\u5f02\u6b65\u4ee3\u7801<\/li><li>\u3000\u3000pthead\u591a\u7ebf\u7a0b<\/li><\/ul>\n\n\n\n<p>\u670d\u52a1\u7aef\uff1a<br>\u3000\u3000\u670d\u52a1\u5668\u7aef\u5148\u521d\u59cb\u5316socket\uff0c\u7136\u540e\u4e0e\u7aef\u53e3\u7ed1\u5b9a\uff0c\u5bf9\u7aef\u53e3\u8fdb\u884c\u76d1\u542c\uff0c\u8c03\u7528accept\u963b\u585e\uff0c\u7b49\u5f85\u5ba2\u6237\u7aef\u8fde\u63a5\u3002<br>\u3000\u3000socket() -&gt; bind() -&gt; listen() -&gt; accept()<br>\u5ba2\u6237\u7aef\uff1a<br>\u3000\u3000\u5ba2\u6237\u7aef\u5148\u521d\u59cb\u5316socket\uff0c\u7136\u540e\u4e0e\u670d\u52a1\u7aef\u8fde\u63a5\uff0c\u670d\u52a1\u7aef\u76d1\u542c\u6210\u529f\u5219\u8fde\u63a5\u5efa\u7acb\u5b8c\u6210<br>\u3000\u3000socket() -&gt; connect()<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">socket\u7684\u5927\u6982\u8fc7\u7a0b\u662f\u8fd9\u6837\u7684\uff1a<\/h2>\n\n\n\n<p>\u3000\u3000\u670d\u52a1\u7aef\u5148\u521b\u5efa\u4e00\u4e2a\u5957\u63a5\u5b57\uff0c\u7aef\u53e3\u7ed1\u5b9a\uff0c\u5bf9\u7aef\u53e3\u8fdb\u884c\u76d1\u542c\uff0c\u8c03\u7528accpet\u963b\u585e\uff0c\u7b49\u5f85\u5ba2\u6237\u7aef\u8fde\u63a5\u3002\u5ba2\u6237\u7aef\u521b\u5efa\u4e00\u4e2a\u5957\u63a5\u5b57\uff0c\u7136\u540e\u901a\u8fc7\u4e09\u6b21\u63e1\u624b\u5b8c\u6210tcp\u8fde\u63a5\u540e\u670d\u52a1\u7aefaccpet\u8fd4\u56de\u91cd\u65b0\u5efa\u7acb\u4e00\u4e2a\u5957\u63a5\u5b57\u4ee3\u8868\u8fd4\u56de\u5ba2\u6237\u7aef\u7684tcp\u8fde\u63a5\uff0c\uff08\u5728accpet\u6210\u529f\u8fd4\u56de\u524d\u6709\u4e00\u4e2a\u8981\u6ce8\u610f\u7684\u662fserver\u4f1a\u6709\u4e24\u4e2a\u961f\u5217\uff0c\u4e00\u4e2a\u5b58\u653e\u5b8c\u6210\u4e09\u6b21\u63e1\u624b\u7684\u4e00\u4e2a\u662f\u672a\u5b8c\u6210\u4e09\u6b21\u63e1\u624b\u7684\uff0c\u6bcf\u6b21accpet\u4f1a\u4ece\u5b8c\u6210\u4e09\u6b21\u63e1\u624b\u7684\u961f\u5217\u4e2d\u53d6\u51fa\u4e00\u4e2a\u5e76\u4e00\u76f4\u5efa\u7acbTCP\u8fde\u63a5\uff0c\u6b64\u65f6\u624d\u80fd\u7b97\u662f\u771f\u6b63\u7684\u8fde\u63a5\u6210\u529f\uff09\uff0c\u5b8c\u6210\u4e0a\u9762\u7684\u6b65\u9aa4\u540e\u5373\u53ef\u4ee5\u5f00\u59cb\u6570\u636e\u7684\u4f20\u8f93\u4e86\uff0c\u6570\u636e\u4f20\u8f93\u7ed3\u675f\u540e\u518d\u8c03\u7528close\u5173\u95ed\u8fde\u63a5<\/p>\n\n\n\n<p>\u3000\u3000\u6b64\u5916\u518d\u8bf4\u4e00\u4e0bselect\u51fd\u6570\u5728server\u548cclient\u53cc\u5411\u901a\u4fe1\u4e2d\u7684\u91cd\u8981\u4f5c\u7528\uff1a\u7f51\u7edc\u7f16\u7a0b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u7ecf\u5e38\u4f1a\u9047\u5230\u8bb8\u591a\u963b\u585e\u7684\u51fd\u6570\uff0c\u7f51\u7edc\u7f16\u7a0b\u65f6\u4f7f\u7528\u7684recv, recvfrom\u3001connect\u51fd\u6570\u90fd\u662f\u963b\u585e\u7684\u51fd\u6570\uff0c\u5f53\u51fd\u6570\u4e0d\u80fd\u6210\u529f\u6267\u884c\u7684\u65f6\u5019\uff0c\u7a0b\u5e8f\u5c31\u4f1a\u4e00\u76f4\u963b\u585e\u5728\u8fd9\u91cc\uff0c\u65e0\u6cd5\u6267\u884c\u4e0b\u9762\u7684\u4ee3\u7801\u3002selcet\u51fd\u6570\u662f\u4e00\u4e2a\u8f6e\u5faa\u51fd\u6570\uff0c\u5373\u5f53\u5faa\u73af\u8be2\u95ee\u6587\u4ef6\u8282\u70b9\uff0c\u53ef\u8bbe\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u8d85\u65f6\u65f6\u95f4\u5230\u4e86\u5c31\u8df3\u8fc7\u4ee3\u7801\u7ee7\u7eed\u5f80\u4e0b\u6267\u884c\uff0c\u5c31\u50cf\u6211\u4eec\u4e0b\u9762\u7684\u7b2c\u4e00\u4e2a\u7a0b\u5e8f\u4e00\u6837\uff0c\u5982\u679c\u4e0d\u6ce8\u91ca\u6389server\u7684send\u90a3\u4e48\u5982\u679cserver\u4e0d\u60f3client\u53d1\u9001\u6d88\u606f\u5219\u8fdb\u7a0b\u5c31\u4f1a\u505c\u987f\u5728\u6b64\u5904\u7b49\u5f85server\u53d1\u9001\u65e0\u6cd5\u6267\u884c\u4e0b\u9762\u7684\u4ee3\u7801\uff0c\u65e0\u6cd5\u63a5\u53d7client\u53d1\u9001\u8fc7\u6765\u7684\u6d88\u606f\uff0c\u7b2c\u4e8c\u4e2a\u7a0b\u5e8f\u5c31\u5bf9\u6b64\u8fdb\u884c\u7684\u6539\u8fdb\uff0c\u5728\u7a0b\u5e8f\u4e2d\u5f15\u5165\u4e86select\u5f53\u8d85\u65f6\u540e\u5c31\u4f1a\u8df3\u8fc7\u5f53\u524d\u4ee3\u7801\uff0c\u6267\u884c\u4e0b\u4e00\u6b65\u4e0d\u4f1a\u4e00\u76f4\u963b\u585e\u3002\uff08poll\u548cepoll\u662f\u5bf9select\u7684\u6539\u8fdb\uff09<\/p>\n\n\n\n<table class=\"wp-block-table\"><thead><tr><th>TCP\u7f16\u7a0b\u7684\u670d\u52a1\u5668\u7aef\u4e00\u822c\u6b65\u9aa4\u662f\uff1a<\/th><th>UDP\u7f16\u7a0b\u7684\u670d\u52a1\u5668\u7aef\u4e00\u822c\u6b65\u9aa4\u662f\uff1a<\/th><\/tr><\/thead><tbody><tr><td>1\u3001\u521b\u5efa\u4e00\u4e2asocket\uff0c\u7528\u51fd\u6570socket()\uff1b \u3000\u30002\u3001\u8bbe\u7f6esocket\u5c5e\u6027\uff0c\u7528\u51fd\u6570setsockopt(); * \u53ef\u9009&nbsp;3\u3001\u7ed1\u5b9aIP\u5730\u5740\u3001\u7aef\u53e3\u7b49\u4fe1\u606f\u5230socket\u4e0a\uff0c\u7528\u51fd\u6570bind(); \u30004\u3001\u5f00\u542f\u76d1\u542c\uff0c\u7528\u51fd\u6570listen()\uff1b \u3000\u30005\u3001\u63a5\u6536\u5ba2\u6237\u7aef\u4e0a\u6765\u7684\u8fde\u63a5\uff0c\u7528\u51fd\u6570accept()\uff1b6\u3001\u6536\u53d1\u6570\u636e\uff0c\u7528\u51fd\u6570send()\u548crecv()\uff0c\u6216\u8005read()\u548cwrite(); \u3000\u30007\u3001\u5173\u95ed\u7f51\u7edc\u8fde\u63a5\uff1b \u3000\u30008\u3001\u5173\u95ed\u76d1\u542c\uff1b<\/td><td>1\u3001\u521b\u5efa\u4e00\u4e2asocket\uff0c\u7528\u51fd\u6570socket()\uff1b \u30002\u3001\u8bbe\u7f6esocket\u5c5e\u6027\uff0c\u7528\u51fd\u6570setsockopt();* \u53ef\u9009 \u3000\u30003\u3001\u7ed1\u5b9aIP\u5730\u5740\u3001\u7aef\u53e3\u7b49\u4fe1\u606f\u5230socket\u4e0a\uff0c\u7528\u51fd\u6570bind();4\u3001\u5faa\u73af\u63a5\u6536\u6570\u636e\uff0c\u7528\u51fd\u6570recvfrom();&nbsp;5\u3001\u5173\u95ed\u7f51\u7edc\u8fde\u63a5\uff1b<\/td><\/tr><tr><td>TCP\u7f16\u7a0b\u7684\u5ba2\u6237\u7aef\u4e00\u822c\u6b65\u9aa4\u662f\uff1a<\/td><td>\u3000UDP\u7f16\u7a0b\u7684\u5ba2\u6237\u7aef\u4e00\u822c\u6b65\u9aa4\u662f\uff1a<\/td><\/tr><tr><td>1\u3001\u521b\u5efa\u4e00\u4e2asocket\uff0c\u7528\u51fd\u6570socket()\uff1b \u3000\u30002\u3001\u8bbe\u7f6esocket\u5c5e\u6027\uff0c\u7528\u51fd\u6570setsockopt();* \u53ef\u9009 \u3000\u30003\u3001\u7ed1\u5b9aIP\u5730\u5740\u3001\u7aef\u53e3\u7b49\u4fe1\u606f\u5230socket\u4e0a\uff0c\u7528\u51fd\u6570bind();* \u53ef\u9009 \u3000\u30004\u3001\u8bbe\u7f6e\u8981\u8fde\u63a5\u7684\u5bf9\u65b9\u7684IP\u5730\u5740\u548c\u7aef\u53e3\u7b49\u5c5e\u6027\uff1b \u3000\u30005\u3001\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u7528\u51fd\u6570connect()\uff1b&nbsp;6\u3001\u6536\u53d1\u6570\u636e\uff0c\u7528\u51fd\u6570send()\u548crecv()\uff0c\u6216\u8005read()\u548cwrite(); \u3000\u30007\u3001\u5173\u95ed\u7f51\u7edc\u8fde\u63a5\uff1b<\/td><td>1\u3001\u521b\u5efa\u4e00\u4e2asocket\uff0c\u7528\u51fd\u6570socket()\uff1b \u3000\u30002\u3001\u8bbe\u7f6esocket\u5c5e\u6027\uff0c\u7528\u51fd\u6570setsockopt();* \u53ef\u9009 \u3000\u30003\u3001\u7ed1\u5b9aIP\u5730\u5740\u3001\u7aef\u53e3\u7b49\u4fe1\u606f\u5230socket\u4e0a\uff0c\u7528\u51fd\u6570bind();* \u53ef\u9009 \u3000\u30004\u3001\u8bbe\u7f6e\u5bf9\u65b9\u7684IP\u5730\u5740\u548c\u7aef\u53e3\u7b49\u5c5e\u6027;&nbsp;5\u3001\u53d1\u9001\u6570\u636e\uff0c\u7528\u51fd\u6570sendto(); \u3000\u30006\u3001\u5173\u95ed\u7f51\u7edc\u8fde\u63a5\uff1b<\/td><\/tr><\/tbody><\/table>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"h1_1\">\u57fa\u672c\u7684\u5c40\u57df\u7f51\u804a\u5929<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h2_2\">\u5c40\u57df\u7f51TCP\u670d\u52a1\u7aef\uff1a<\/h2>\n\n\n\n<p>\u5b9e\u73b0\u7684\u529f\u80fd\u662fclient\u5230server\u7684\u534a\u53cc\u5de5\u901a\u4fe1\uff0cserver\u53ea\u80fd\u63a5\u53d7\u63a5\u6536client\u53d1\u9001\u8fc7\u6765\u7684\u6d88\u606f\uff0c\u4f46\u662f\u4e0d\u80fd\u5411client\u53d1\u9001\u6d88\u606f\u3002<\/p>\n\n\n\n<table class=\"wp-block-table\"><tbody><tr><td><\/td><td> <br><code>#include &lt;sys\/types.h><\/code><br><code>#include &lt;sys\/socket.h><\/code><br><code>#include &lt;stdio.h><\/code><br><code>#include &lt;netinet\/in.h><\/code><br><code>#include &lt;arpa\/inet.h><\/code><br><code>#include &lt;unistd.h><\/code><br><code>#include &lt;string.h><\/code><br><code>#include &lt;stdlib.h><\/code><br><code>#include &lt;fcntl.h><\/code><br><code>#include &lt;sys\/shm.h><\/code><br><code>#include &lt;thread><\/code><br><code>#include &lt;iostream><\/code><br><code>#define PORT 7000<\/code><br><code>#define QUEUE 20\/\/\u8fde\u63a5\u8bf7\u6c42\u961f\u5217<\/code><br><code>int<\/code>\u00a0<code>conn;<\/code><br><code>void<\/code>\u00a0<code>thread_task()<\/code><br><code>{<\/code><br><code>}<\/code><br>\u00a0<br><code>int<\/code>\u00a0<code>main()<\/code><br><code>{<\/code><br><code>\/\/printf(\"%d\\n\",AF_INET);\/\/IPv4\u534f\u8bae<\/code><br><code>printf(\"%d\\n\",SOCK_STREAM);\/\/\u5b57\u8282\u6d41\u5957\u63a5\u5b57<\/code><br><code>int<\/code>\u00a0<code>ss = socket(AF_INET, SOCK_STREAM, 0);\/\/\u82e5\u6210\u529f\u5219\u8fd4\u56de\u4e00\u4e2asockfd\uff08\u5957\u63a5\u5b57\u63cf\u8ff0\u7b26\uff09<\/code><br><code>\/\/printf(\"%d\\n\",ss);<\/code><br><code>struct<\/code>\u00a0<code>sockaddr_in server_sockaddr;\/\/\u4e00\u822c\u662f\u50a8\u5b58\u5730\u5740\u548c\u7aef\u53e3\u7684\u3002\u7528\u4e8e\u4fe1\u606f\u7684\u663e\u793a\u53ca\u5b58\u50a8\u4f7f\u7528<\/code><br><code>\/*\u8bbe\u7f6e sockaddr_in \u7ed3\u6784\u4f53\u4e2d\u76f8\u5173\u53c2\u6570*\/<\/code><br><code>server_sockaddr.sin_family = AF_INET;<\/code><br><code>server_sockaddr.sin_port = htons(PORT);\/\/\u5c06\u4e00\u4e2a\u65e0\u7b26\u53f7\u77ed\u6574\u578b\u6570\u503c\u8f6c\u6362\u4e3a\u7f51\u7edc\u5b57\u8282\u5e8f\uff0c\u5373\u5927\u7aef\u6a21\u5f0f(big-endian)\u3000<\/code><br><code>\/\/printf(\"%d\\n\",INADDR_ANY);<\/code><br><code>\/\/INADDR_ANY\u5c31\u662f\u6307\u5b9a\u5730\u5740\u4e3a0.0.0.0\u7684\u5730\u5740\uff0c\u8fd9\u4e2a\u5730\u5740\u4e8b\u5b9e\u4e0a\u8868\u793a\u4e0d\u786e\u5b9a\u5730\u5740\uff0c\u6216\u201c\u6240\u6709\u5730\u5740\u201d\u3001\u201c\u4efb\u610f\u5730\u5740\u201d\u3002<\/code><br><code>\/\/\u4e00\u822c\u6765\u8bf4\uff0c\u5728\u5404\u4e2a\u7cfb\u7edf\u4e2d\u5747\u5b9a\u4e49\u6210\u4e3a0\u503c\u3002<\/code><br><code>server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);\/\/\u5c06\u4e3b\u673a\u7684\u65e0\u7b26\u53f7\u957f\u6574\u5f62\u6570\u8f6c\u6362\u6210\u7f51\u7edc\u5b57\u8282\u987a\u5e8f\u3002\u3000<\/code><br><code>if(bind(ss, (struct<\/code>\u00a0<code>sockaddr* ) &amp;server_sockaddr,\u00a0sizeof(server_sockaddr))==-1)<\/code><br><code>{<\/code><br><code>perror(\"bind\");<\/code><br><code>exit(1);<\/code><br><code>}<\/code><br><code>if(listen(ss, QUEUE) == -1)<\/code><br><code>{<\/code><br><code>perror(\"listen\");<\/code><br><code>exit(1);<\/code><br><code>}<\/code><br>\u00a0<br><code>struct<\/code>\u00a0<code>sockaddr_in client_addr;<\/code><br><code>socklen_t length =\u00a0sizeof(client_addr);<\/code><br><code>\/\/\/\u6210\u529f\u8fd4\u56de\u975e\u8d1f\u63cf\u8ff0\u5b57\uff0c\u51fa\u9519\u8fd4\u56de-1<\/code><br><code>conn = accept(ss, (struct<\/code>\u00a0<code>sockaddr*)&amp;client_addr, &amp;length);<\/code><br><code>\/\/\u5982\u679caccpet\u6210\u529f\uff0c\u90a3\u4e48\u5176\u8fd4\u56de\u503c\u662f\u7531\u5185\u6838\u81ea\u52a8\u751f\u6210\u7684\u4e00\u4e2a\u5168\u65b0\u63cf\u8ff0\u7b26\uff0c\u4ee3\u8868\u4e0e\u6240\u8fd4\u56de\u5ba2\u6237\u7684TCP\u8fde\u63a5\u3002<\/code><br><code>\/\/accpet\u4e4b\u540e\u5c31\u4f1a\u7528\u65b0\u7684\u5957\u63a5\u5b57conn<\/code><br><code>if( conn &lt; 0 )<\/code><br><code>{<\/code><br><code>perror(\"connect\");<\/code><br><code>exit(1);<\/code><br><code>}<\/code><br>\u00a0<br><code>char<\/code>\u00a0<code>buffer[1024];<\/code><br><code>\/\/\u521b\u5efa\u53e6\u5916\u4e00\u4e2a\u7ebf\u7a0b<\/code><br><code>\/\/std::thread t(thread_task);<\/code><br><code>\/\/t.join();<\/code><br><code>\/\/char buf[1024];<\/code><br><code>\/\/\u4e3b\u7ebf\u7a0b<\/code><br><code>while(1)<\/code><br><code>{<\/code><br><code>\/\/\u8fd9\u91cc\u628asend\u6ce8\u91ca\u6389\u4e86\uff0c\u6240\u4ee5\u8fd9\u4e2a\u7a0b\u5e8f\u4e2dserver\u53ea\u80fd\u662f\u63a5\u6536client\u7aef\u7684\u6570\u636e\u5e76\u80fd\u7ed9client\u53d1\u9001\u6570\u636e\uff0c\u5373\u4f7f\u4e0d\u6ce8\u91ca\u6389\u4e5f\u6ca1\u7528\uff0c\u56e0\u4e3a\u6ca1\u6709\u5bf9\u662f\u5426\u6709\u6570\u636e\u4f20\u5165\u548c\u4f20\u5165<\/code><br><code>\/\/\u8fdb\u884c\u5224\u65ad\u6240\u4ee5\u6309\u7167\u4e0b\u9762\u7684\u4ee3\u7801\u8fd9\u6837\u5199\uff0c\u6bcf\u6b21\u90fd\u8981\u5148\u8ba9server\u8f93\u5165\u540e\u624d\u80fd\u8f93\u51faclient\u4f20\u8fc7\u6765\u7684\u6570\u636e\uff0c\u82e5\u662fserver\u4e0d\u8f93\u5165\u5219\u7a0b\u5e8f\u65e0\u6cd5\u5411\u4e0b\u8d70\u5c31\u6ca1\u6709client\u53d1\u9001\u8fc7\u6765\u7684\u8f93\u51fa\uff0c<\/code><br><code>\/\/\u800c\u4e14\u6bcf\u6b21\u663e\u793a\u4e5f\u53ea\u80fd\u662f\u4e00\u884c\uff0c\u8fd9\u6837\u663e\u793a\u5c31\u5168\u662f\u9519\u7684\u4e86\uff0c\u6240\u4ee5\u5c31\u9700\u8981select\u548cFD_ISSET\u7684\u5224\u65ad\u4e86<\/code><br><code>\/\/ memset(buf, 0 ,sizeof(buf));<\/code><br><code>\/\/ if(fgets(buf, sizeof(buf),stdin) != NULL) {<\/code><br><code>\/\/\u00a0\u00a0\u00a0\u00a0 send(conn, buf, sizeof(buf), 0);\u00a0\u00a0\u00a0<\/code><br><code>\/\/ }<\/code><br>\u00a0<br><code>memset(buffer, 0 ,sizeof(buffer));<\/code><br><code>int<\/code>\u00a0<code>len = recv(conn, buffer,\u00a0sizeof(buffer), 0);\/\/\u4eceTCP\u8fde\u63a5\u7684\u53e6\u4e00\u7aef\u63a5\u6536\u6570\u636e\u3002<\/code><br><code>\/*\u8be5\u51fd\u6570\u7684\u7b2c\u4e00\u4e2a\u53c2\u6570\u6307\u5b9a\u63a5\u6536\u7aef\u5957\u63a5\u5b57\u63cf\u8ff0\u7b26\uff1b<\/code><br><code>\u7b2c\u4e8c\u4e2a\u53c2\u6570\u6307\u660e\u4e00\u4e2a\u7f13\u51b2\u533a\uff0c\u8be5\u7f13\u51b2\u533a\u7528\u6765\u5b58\u653erecv\u51fd\u6570\u63a5\u6536\u5230\u7684\u6570\u636e\uff1b<\/code><br><code>\u7b2c\u4e09\u4e2a\u53c2\u6570\u6307\u660ebuf\u7684\u957f\u5ea6\uff1b<\/code><br><code>\u7b2c\u56db\u4e2a\u53c2\u6570\u4e00\u822c\u7f6e0*\/<\/code><br><code>if(strcmp(buffer,\u00a0\"exit\\n\") == 0)\/\/\u5982\u679c\u6ca1\u6709\u6536\u5230TCP\u53e6\u4e00\u7aef\u53d1\u6765\u7684\u6570\u636e\u5219\u8df3\u51fa\u5faa\u73af\u4e0d\u8f93\u51fa<\/code><br><code>{<\/code><br><code>break;<\/code><br><code>}<\/code><br><code>printf(\"%s\", buffer);\/\/\u5982\u679c\u6709\u6536\u5230\u6570\u636e\u5219\u8f93\u51fa\u6570\u636e<\/code><br><code>\/\/\u5fc5\u987b\u8981\u6709\u8fd4\u56de\u6570\u636e\uff0c \u8fd9\u6837\u624d\u7b97\u4e00\u4e2a\u5b8c\u6574\u7684\u8bf7\u6c42<\/code><br><code>send(conn, buffer, len , 0);\/\/\u5411TCP\u8fde\u63a5\u7684\u53e6\u4e00\u7aef\u53d1\u9001\u6570\u636e\u3002<\/code><br><code>}<\/code><br><code>close(conn);\/\/\u56e0\u4e3aaccpet\u51fd\u6570\u8fde\u63a5\u6210\u529f\u540e\u8fd8\u4f1a\u751f\u6210\u4e00\u4e2a\u65b0\u7684\u5957\u63a5\u5b57\u63cf\u8ff0\u7b26\uff0c\u7ed3\u675f\u540e\u4e5f\u9700\u8981\u5173\u95ed<\/code><br><code>close(ss);\/\/\u5173\u95edsocket\u5957\u63a5\u5b57\u63cf\u8ff0\u7b26<\/code><br><code>return<\/code>\u00a0<code>0;<\/code><br><code>}<\/code> <\/td><\/tr><\/tbody><\/table>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h2_3\">\u5c40\u57df\u7f51TCP\u5ba2\u6237\u7aef\uff1a<\/h2>\n\n\n\n<table class=\"wp-block-table\"><tbody><tr><td><\/td><td>  <br><code>\/*\u5c40\u57df\u7f51TCP\u5ba2\u6237\u7aef*\/<\/code><br><code>#include &lt;sys\/types.h><\/code><br><code>#include &lt;sys\/socket.h><\/code><br><code>#include &lt;stdio.h><\/code><br><code>#include &lt;netinet\/in.h><\/code><br><code>#include &lt;arpa\/inet.h><\/code><br><code>#include &lt;unistd.h><\/code><br><code>#include &lt;string.h><\/code><br><code>#include &lt;stdlib.h><\/code><br><code>#include &lt;fcntl.h><\/code><br><code>#include &lt;sys\/shm.h><\/code><br>\u00a0<br><code>#define MYPORT\u00a0 7000<\/code><br><code>#define BUFFER_SIZE 1024<\/code><br>\u00a0<br><code>int<\/code>\u00a0<code>main()<\/code><br><code>{<\/code><br><code>\/\/\/\u5b9a\u4e49sockfd<\/code><br><code>int<\/code>\u00a0<code>sock_cli = socket(AF_INET,SOCK_STREAM, 0);<\/code><br>\u00a0<br><code>\/\/\/\u5b9a\u4e49sockaddr_in<\/code><br><code>struct<\/code>\u00a0<code>sockaddr_in servaddr;<\/code><br><code>memset(&amp;servaddr, 0,\u00a0sizeof(servaddr));<\/code><br><code>servaddr.sin_family = AF_INET;<\/code><br><code>servaddr.sin_port = htons(MYPORT);\u00a0\u00a0\/\/\u670d\u52a1\u5668\u7aef\u53e3<\/code><br><code>servaddr.sin_addr.s_addr = inet_addr(\"127.0.0.1\");\u00a0\u00a0\/\/\u670d\u52a1\u5668ip\uff0cinet_addr\u7528\u4e8eIPv4\u7684IP\u8f6c\u6362\uff08\u5341\u8fdb\u5236\u8f6c\u6362\u4e3a\u4e8c\u8fdb\u5236\uff09<\/code><br><code>\/\/127.0.0.1\u662f\u672c\u5730\u9884\u7559\u5730\u5740<\/code><br><code>\/\/\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u6210\u529f\u8fd4\u56de0\uff0c\u9519\u8bef\u8fd4\u56de-1<\/code><br><code>if<\/code>\u00a0<code>(connect(sock_cli, (struct<\/code>\u00a0<code>sockaddr *)&amp;servaddr,\u00a0sizeof(servaddr)) &lt; 0)<\/code><br><code>{<\/code><br><code>perror(\"connect\");<\/code><br><code>exit(1);<\/code><br><code>}<\/code><br>\u00a0<br><code>char<\/code>\u00a0<code>sendbuf[BUFFER_SIZE];<\/code><br><code>char<\/code>\u00a0<code>recvbuf[BUFFER_SIZE];<\/code><br>\u00a0<br><code>while<\/code>\u00a0<code>(fgets(sendbuf,\u00a0sizeof(sendbuf), stdin) != NULL)<\/code><br><code>{\/*\u6bcf\u6b21\u8bfb\u53d6\u4e00\u884c\uff0c\u8bfb\u53d6\u7684\u6570\u636e\u4fdd\u5b58\u5728buf\u6307\u5411\u7684\u5b57\u7b26\u6570\u7ec4\u4e2d\uff0c\u6210\u529f\uff0c\u5219\u8fd4\u56de\u7b2c\u4e00\u4e2a\u53c2\u6570buf\uff1b*\/<\/code><br><code>send(sock_cli, sendbuf,\u00a0strlen(sendbuf),0);\u00a0\/\/\/\u53d1\u9001<\/code><br><code>if(strcmp(sendbuf,\"exit\\n\")==0)<\/code><br><code>break;<\/code><br><code>recv(sock_cli, recvbuf,\u00a0sizeof(recvbuf),0);\u00a0\/\/\/\u63a5\u6536<\/code><br><code>fputs(recvbuf, stdout);<\/code><br>\u00a0<br><code>memset(sendbuf, 0,\u00a0sizeof(sendbuf));\/\/\u63a5\u53d7\u6216\u8005\u53d1\u9001\u5b8c\u6bd5\u540e\u628a\u6570\u7ec4\u4e2d\u7684\u6570\u636e\u5168\u90e8\u6e05\u7a7a\uff08\u7f6e0\uff09<\/code><br><code>memset(recvbuf, 0,\u00a0sizeof(recvbuf));<\/code><br><code>}<\/code><br><code>close(sock_cli);<\/code><br><code>return<\/code>\u00a0<code>0;<\/code><br><code>}<\/code><br><code>\/*\u5728TCP\u4e09\u6b21\u63e1\u624b\u5b8c\u6210\u540e\u4f1a\u8fdb\u5165\u7b49\u5f85\u8fde\u63a5\u961f\u5217\uff0c\u7b49\u5f85\u670d\u52a1\u7aef\u8c03\u7528accpet\u4e0e\u4e4b\u5efa\u7acb\u8fde\u63a5\uff0c\u8fd9\u65f6\u5019\u662fserver\u7aef\u8c03\u7528accept\u8ddf\u5ba2\u6237\u7aef\u5efa\u7acb<\/code><br><code>\u901a\u4fe1\uff0c\u5ba2\u6237\u7aef\u5e76\u4e0d\u9700\u8981\u8c03\u7528accpet\uff0c\u56e0\u4e3a\u6709\u5f88\u591a\u4e2a\u5ba2\u6237\u7aef\u8981\u8ddf\u670d\u52a1\u7aef\u5efa\u7acb\u8fde\u63a5\uff0c\u8fd9\u65f6\u5019\u670d\u52a1\u7aef\u5c31\u4f1a\u6709\u4e00\u4e2a\u961f\u5217\uff0c\u5bf9\u5df2\u7ecf\u7ecf\u8fc7\u4e09\u6b21\u63e1<\/code><br><code>\u624b\u7684\u624d\u53ef\u4ee5\u5efa\u7acb\u8fde\u63a5\uff08\u7c7b\u4f3c\u7f13\u5b58\u4fe1\u606f\uff09\uff0c\u8fd9\u4e2a\u662f\u7531\u670d\u52a1\u7aef\u6765\u786e\u8ba4\u7684\uff0c\u5ba2\u6237\u7aef\u5e76\u4e0d\u77e5\u9053\u4ec0\u4e48\u65f6\u5019\u670d\u52a1\u7aef\u624d\u80fd\u8ddf\u5b83\u5efa\u7acb\u8fde\u63a5\uff0c\u5728\u670d\u52a1\u7aef<\/code><br><code>\u6ca1\u6709\u8c03\u7528accept\u4e0e\u4e4b\u8fde\u63a5\u6216\u8005\u8fd8\u672a\u6392\u961f\u5230\u5b83\uff0c\u53ea\u80fd\u662f\u4e00\u76f4\u7b49\u5f85\uff0c\u76f4\u5230\u670d\u52a1\u7aef\u51c6\u5907\u597d\u4e86\u624d\u80fd\u8ddf\u5ba2\u6237\u7aef\u5efa\u7acb\u8fde\u63a5\uff0c\u6240\u4ee5\u4e3b\u52a8\u6743\u5728\u670d\u52a1\u7aef*\/<\/code> <\/td><\/tr><\/tbody><\/table>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"h1_5\">\u5ba2\u6237\u7aef\u670d\u52a1\u7aef\u53cc\u5411\u5f02\u6b65\u804a\u5929\u6e90\u7801<\/h1>\n\n\n\n<p>\u4ee5\u4e0a\u7684\u5c40\u57df\u7f51\u804a\u5929\u5e94\u7528\u6709\u4e00\u4e2a\u5f88\u91cd\u8981\u7684\u7f3a\u70b9\uff0c \u670d\u52a1\u5668\u53ea\u80fd\u663e\u793a\u5ba2\u6237\u7aef\u53d1\u9001\u7684\u6d88\u606f\uff0c \u5374\u65e0\u6cd5\u7ed9\u5ba2\u6237\u7aef\u53d1\u9001\u6d88\u606f\uff0c \u8fd9\u4e2a\u5f88\u5c34\u5c2c\uff1b<\/p>\n\n\n\n<p>\u901a\u8fc7\u4f7f\u7528C\u4e2d\u7684select()\u51fd\u6570\uff0c \u5b9e\u73b0\u4e00\u4e2a\u5f02\u6b65\u804a\u5929\u5de5\u5177\uff1a<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h2_6\">\u5f02\u6b65\u804a\u5929\u670d\u52a1\u7aef\u4ee3\u7801\uff1a<\/h2>\n\n\n\n<table class=\"wp-block-table\"><tbody><tr><td><\/td><td> <br><code>\/*\u5c40\u57df\u7f51TCP\u5ba2\u6237\u7aef*\/<\/code><br><code>#include &lt;sys\/types.h><\/code><br><code>#include &lt;sys\/socket.h><\/code><br><code>#include &lt;stdio.h><\/code><br><code>#include &lt;netinet\/in.h><\/code><br><code>#include &lt;arpa\/inet.h><\/code><br><code>#include &lt;unistd.h><\/code><br><code>#include &lt;string.h><\/code><br><code>#include &lt;stdlib.h><\/code><br><code>#include &lt;fcntl.h><\/code><br><code>#include &lt;sys\/shm.h><\/code><br>\u00a0<br><code>#define MYPORT\u00a0 7000<\/code><br><code>#define BUFFER_SIZE 1024<\/code><br>\u00a0<br><code>int<\/code>\u00a0<code>main()<\/code><br><code>{<\/code><br><code>\/\/\/\u5b9a\u4e49sockfd<\/code><br><code>int<\/code>\u00a0<code>sock_cli = socket(AF_INET,SOCK_STREAM, 0);<\/code><br>\u00a0<br><code>\/\/\/\u5b9a\u4e49sockaddr_in<\/code><br><code>struct<\/code>\u00a0<code>sockaddr_in servaddr;<\/code><br><code>memset(&amp;servaddr, 0,\u00a0sizeof(servaddr));<\/code><br><code>servaddr.sin_family = AF_INET;<\/code><br><code>servaddr.sin_port = htons(MYPORT);\u00a0\u00a0\/\/\u670d\u52a1\u5668\u7aef\u53e3<\/code><br><code>servaddr.sin_addr.s_addr = inet_addr(\"127.0.0.1\");\u00a0\u00a0\/\/\u670d\u52a1\u5668ip\uff0cinet_addr\u7528\u4e8eIPv4\u7684IP\u8f6c\u6362\uff08\u5341\u8fdb\u5236\u8f6c\u6362\u4e3a\u4e8c\u8fdb\u5236\uff09<\/code><br><code>\/\/127.0.0.1\u662f\u672c\u5730\u9884\u7559\u5730\u5740<\/code><br><code>\/\/\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u6210\u529f\u8fd4\u56de0\uff0c\u9519\u8bef\u8fd4\u56de-1<\/code><br><code>if<\/code>\u00a0<code>(connect(sock_cli, (struct<\/code>\u00a0<code>sockaddr *)&amp;servaddr,\u00a0sizeof(servaddr)) &lt; 0)<\/code><br><code>{<\/code><br><code>perror(\"connect\");<\/code><br><code>exit(1);<\/code><br><code>}<\/code><br>\u00a0<br><code>char<\/code>\u00a0<code>sendbuf[BUFFER_SIZE];<\/code><br><code>char<\/code>\u00a0<code>recvbuf[BUFFER_SIZE];<\/code><br>\u00a0<br><code>while<\/code>\u00a0<code>(fgets(sendbuf,\u00a0sizeof(sendbuf), stdin) != NULL)<\/code><br><code>{\/*\u6bcf\u6b21\u8bfb\u53d6\u4e00\u884c\uff0c\u8bfb\u53d6\u7684\u6570\u636e\u4fdd\u5b58\u5728buf\u6307\u5411\u7684\u5b57\u7b26\u6570\u7ec4\u4e2d\uff0c\u6210\u529f\uff0c\u5219\u8fd4\u56de\u7b2c\u4e00\u4e2a\u53c2\u6570buf\uff1b*\/<\/code><br><code>send(sock_cli, sendbuf,\u00a0strlen(sendbuf),0);\u00a0\/\/\/\u53d1\u9001<\/code><br><code>if(strcmp(sendbuf,\"exit\\n\")==0)<\/code><br><code>break;<\/code><br><code>recv(sock_cli, recvbuf,\u00a0sizeof(recvbuf),0);\u00a0\/\/\/\u63a5\u6536<\/code><br><code>fputs(recvbuf, stdout);<\/code><br>\u00a0<br><code>memset(sendbuf, 0,\u00a0sizeof(sendbuf));\/\/\u63a5\u53d7\u6216\u8005\u53d1\u9001\u5b8c\u6bd5\u540e\u628a\u6570\u7ec4\u4e2d\u7684\u6570\u636e\u5168\u90e8\u6e05\u7a7a\uff08\u7f6e0\uff09<\/code><br><code>memset(recvbuf, 0,\u00a0sizeof(recvbuf));<\/code><br><code>}<\/code><br><code>close(sock_cli);<\/code><br><code>return<\/code>\u00a0<code>0;<\/code><br><code>}<\/code><br><code>\/*\u5728TCP\u4e09\u6b21\u63e1\u624b\u5b8c\u6210\u540e\u4f1a\u8fdb\u5165\u7b49\u5f85\u8fde\u63a5\u961f\u5217\uff0c\u7b49\u5f85\u670d\u52a1\u7aef\u8c03\u7528accpet\u4e0e\u4e4b\u5efa\u7acb\u8fde\u63a5\uff0c\u8fd9\u65f6\u5019\u662fserver\u7aef\u8c03\u7528accept\u8ddf\u5ba2\u6237\u7aef\u5efa\u7acb<\/code><br><code>\u901a\u4fe1\uff0c\u5ba2\u6237\u7aef\u5e76\u4e0d\u9700\u8981\u8c03\u7528accpet\uff0c\u56e0\u4e3a\u6709\u5f88\u591a\u4e2a\u5ba2\u6237\u7aef\u8981\u8ddf\u670d\u52a1\u7aef\u5efa\u7acb\u8fde\u63a5\uff0c\u8fd9\u65f6\u5019\u670d\u52a1\u7aef\u5c31\u4f1a\u6709\u4e00\u4e2a\u961f\u5217\uff0c\u5bf9\u5df2\u7ecf\u7ecf\u8fc7\u4e09\u6b21\u63e1<\/code><br><code>\u624b\u7684\u624d\u53ef\u4ee5\u5efa\u7acb\u8fde\u63a5\uff08\u7c7b\u4f3c\u7f13\u5b58\u4fe1\u606f\uff09\uff0c\u8fd9\u4e2a\u662f\u7531\u670d\u52a1\u7aef\u6765\u786e\u8ba4\u7684\uff0c\u5ba2\u6237\u7aef\u5e76\u4e0d\u77e5\u9053\u4ec0\u4e48\u65f6\u5019\u670d\u52a1\u7aef\u624d\u80fd\u8ddf\u5b83\u5efa\u7acb\u8fde\u63a5\uff0c\u5728\u670d\u52a1\u7aef<\/code><br><code>\u6ca1\u6709\u8c03\u7528accept\u4e0e\u4e4b\u8fde\u63a5\u6216\u8005\u8fd8\u672a\u6392\u961f\u5230\u5b83\uff0c\u53ea\u80fd\u662f\u4e00\u76f4\u7b49\u5f85\uff0c\u76f4\u5230\u670d\u52a1\u7aef\u51c6\u5907\u597d\u4e86\u624d\u80fd\u8ddf\u5ba2\u6237\u7aef\u5efa\u7acb\u8fde\u63a5\uff0c\u6240\u4ee5\u4e3b\u52a8\u6743\u5728\u670d\u52a1\u7aef*\/<\/code> <\/td><\/tr><\/tbody><\/table>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h2_7\">\u5f02\u6b65\u804a\u5929\u5ba2\u6237\u7aef\u4ee3\u7801\uff1a<\/h2>\n\n\n\n<table class=\"wp-block-table\"><tbody><tr><td><\/td><td> <br><code>#include &lt;sys\/types.h><\/code><br><code>#include &lt;sys\/socket.h><\/code><br><code>#include &lt;stdio.h><\/code><br><code>#include &lt;netinet\/in.h><\/code><br><code>#include &lt;arpa\/inet.h><\/code><br><code>#include &lt;unistd.h><\/code><br><code>#include &lt;string.h><\/code><br><code>#include &lt;stdlib.h><\/code><br><code>#include &lt;fcntl.h><\/code><br><code>#include &lt;sys\/shm.h><\/code><br><code>#include &lt;iostream><\/code><br><code>#define PORT 7000<\/code><br><code>#define QUEUE 20<\/code><br>\u00a0<br><code>int<\/code>\u00a0<code>main()<\/code><br><code>{<\/code><br><code>fd_set rfds;<\/code><br><code>struct<\/code>\u00a0<code>timeval tv;<\/code><br><code>int<\/code>\u00a0<code>retval, maxfd;<\/code><br><code>int<\/code>\u00a0<code>ss = socket(AF_INET, SOCK_STREAM, 0);<\/code><br><code>struct<\/code>\u00a0<code>sockaddr_in server_sockaddr;<\/code><br><code>server_sockaddr.sin_family = AF_INET;<\/code><br><code>server_sockaddr.sin_port = htons(PORT);<\/code><br><code>\/\/printf(\"%d\\n\",INADDR_ANY);<\/code><br><code>server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);<\/code><br><code>if(bind(ss, (struct<\/code>\u00a0<code>sockaddr* ) &amp;server_sockaddr,\u00a0sizeof(server_sockaddr))==-1)<\/code><br><code>{<\/code><br><code>perror(\"bind\");<\/code><br><code>exit(1);<\/code><br><code>}<\/code><br><code>if(listen(ss, QUEUE) == -1)<\/code><br><code>{<\/code><br><code>perror(\"listen\");<\/code><br><code>exit(1);<\/code><br><code>}<\/code><br>\u00a0<br><code>struct<\/code>\u00a0<code>sockaddr_in client_addr;<\/code><br><code>socklen_t length =\u00a0sizeof(client_addr);<\/code><br><code>\/\/\/\u6210\u529f\u8fd4\u56de\u975e\u8d1f\u63cf\u8ff0\u5b57\uff0c\u51fa\u9519\u8fd4\u56de-1<\/code><br><code>int<\/code>\u00a0<code>conn = accept(ss, (struct<\/code>\u00a0<code>sockaddr*)&amp;client_addr, &amp;length);<\/code><br><code>\/*\u6ca1\u6709\u7528\u6765\u5b58\u50a8accpet\u8fd4\u56de\u7684\u5957\u63a5\u5b57\u7684\u6570\u7ec4\uff0c\u6240\u4ee5\u53ea\u80fd\u5b9e\u73b0server\u548c\u5355\u4e2aclient\u53cc\u5411\u901a\u4fe1*\/<\/code><br><code>if( conn &lt; 0 )<\/code><br><code>{<\/code><br><code>perror(\"connect\");<\/code><br><code>exit(1);<\/code><br><code>}<\/code><br><code>while(1)<\/code><br><code>{<\/code><br><code>\/*\u628a\u53ef\u8bfb\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u96c6\u5408\u6e05\u7a7a*\/<\/code><br><code>FD_ZERO(&amp;rfds);<\/code><br><code>\/*\u628a\u6807\u51c6\u8f93\u5165\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u52a0\u5165\u5230\u96c6\u5408\u4e2d*\/<\/code><br><code>FD_SET(0, &amp;rfds);<\/code><br><code>maxfd = 0;<\/code><br><code>\/*\u628a\u5f53\u524d\u8fde\u63a5\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u52a0\u5165\u5230\u96c6\u5408\u4e2d*\/<\/code><br><code>FD_SET(conn, &amp;rfds);<\/code><br><code>\/*\u627e\u51fa\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408\u4e2d\u6700\u5927\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26*\/<\/code>\u00a0\u00a0\u00a0<br><code>if(maxfd &lt; conn)<\/code><br><code>maxfd = conn;<\/code><br><code>\/*\u8bbe\u7f6e\u8d85\u65f6\u65f6\u95f4*\/<\/code><br><code>tv.tv_sec = 5;\/\/\u8bbe\u7f6e\u5012\u8ba1\u65f6<\/code><br><code>tv.tv_usec = 0;<\/code><br><code>\/*\u7b49\u5f85\u804a\u5929*\/<\/code><br><code>retval = select(maxfd+1, &amp;rfds, NULL, NULL, &amp;tv);<\/code><br><code>if(retval == -1)<\/code><br><code>{<\/code><br><code>printf(\"select\u51fa\u9519\uff0c\u5ba2\u6237\u7aef\u7a0b\u5e8f\u9000\u51fa\\n\");<\/code><br><code>break;<\/code><br><code>}<\/code><br><code>else<\/code>\u00a0<code>if(retval == 0)<\/code><br><code>{<\/code><br><code>printf(\"\u670d\u52a1\u7aef\u6ca1\u6709\u4efb\u4f55\u8f93\u5165\u4fe1\u606f\uff0c\u5e76\u4e14\u5ba2\u6237\u7aef\u4e5f\u6ca1\u6709\u4fe1\u606f\u5230\u6765\uff0cwaiting...\\n\");<\/code><br><code>continue;<\/code><br><code>}<\/code><br><code>else<\/code><br><code>{<\/code><br><code>\/*\u5ba2\u6237\u7aef\u53d1\u6765\u4e86\u6d88\u606f*\/<\/code><br><code>if(FD_ISSET(conn,&amp;rfds))<\/code><br><code>{<\/code><br><code>char<\/code>\u00a0<code>buffer[1024];\u00a0\u00a0\u00a0<\/code><br><code>memset(buffer, 0 ,sizeof(buffer));<\/code><br><code>int<\/code>\u00a0<code>len = recv(conn, buffer,\u00a0sizeof(buffer), 0);<\/code><br><code>if(strcmp(buffer,\u00a0\"exit\\n\") == 0)\u00a0break;<\/code><br><code>printf(\"%s\", buffer);<\/code><br><code>\/\/send(conn, buffer, len , 0);\u628a\u6570\u636e\u56de\u53d1\u7ed9\u5ba2\u6237\u7aef<\/code><br><code>}<\/code><br><code>\/*\u7528\u6237\u8f93\u5165\u4fe1\u606f\u4e86,\u5f00\u59cb\u5904\u7406\u4fe1\u606f\u5e76\u53d1\u9001*\/<\/code><br><code>if(FD_ISSET(0, &amp;rfds))<\/code><br><code>{<\/code><br><code>char<\/code>\u00a0<code>buf[1024];<\/code><br><code>fgets(buf,\u00a0sizeof(buf), stdin);<\/code><br><code>\/\/printf(\"you are send %s\", buf);<\/code><br><code>send(conn, buf,\u00a0sizeof(buf), 0);\u00a0\u00a0\u00a0<\/code><br><code>}<\/code><br><code>}<\/code><br><code>}<\/code><br><code>close(conn);<\/code><br><code>close(ss);<\/code><br><code>return<\/code>\u00a0<code>0;<\/code><br><code>}<\/code> <\/td><\/tr><\/tbody><\/table>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"h1_9\">\u5c40\u57df\u7f51\u5185\u670d\u52a1\u7aef\u548c\u6709\u9650\u4e2a\u5ba2\u6237\u7aef\u804a\u5929\u6e90\u7801<\/h1>\n\n\n\n<p>\u4ee5\u4e0a\u7684\u5c40\u57df\u7f51\u804a\u5929\u53ea\u80fd\u652f\u6301\u4e00\u4e2a\u7528\u6237\uff0c \u6211\u4eec\u8fd8\u8981\u6539\u6539\uff0c \u5fc5\u987b\u662f\u652f\u6301\u591a\u7528\u6237\u7684\u804a\u5929\u5ba4\uff1a<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h2_10\">\u5c40\u57df\u7f51TCP2\u4eba\u804a\u5929\u670d\u52a1\u7aef\u4ee3\u7801<\/h2>\n\n\n\n<table class=\"wp-block-table\"><tbody><tr><td><\/td><td><code>#include &lt;sys\/types.h&gt;<\/code><code>#include &lt;sys\/socket.h&gt;<\/code><code>#include &lt;stdio.h&gt;<\/code><code>#include &lt;netinet\/in.h&gt;<\/code><code>#include &lt;arpa\/inet.h&gt;<\/code><code>#include &lt;unistd.h&gt;<\/code><code>#include &lt;string.h&gt;<\/code><code>#include &lt;stdlib.h&gt;<\/code><code>#include &lt;fcntl.h&gt;<\/code><code>#include &lt;sys\/shm.h&gt;<\/code><code>#include &lt;iostream&gt;<\/code><code>#include &lt;thread&gt;<\/code><code>#define PORT 7000<\/code><code>#define QUEUE 20<\/code><code>int<\/code>&nbsp;<code>ss;<\/code><code>struct<\/code>&nbsp;<code>sockaddr_in client_addr;<\/code><code>socklen_t length =&nbsp;<\/code><code>sizeof<\/code><code>(client_addr);<\/code><code>int<\/code>&nbsp;<code>conns[2] = {};<\/code><code>\/\/\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5bb9\u91cf\u4e3a2\u7684\u6570\u7ec4\u6765\u5b58\u653e\u5957\u63a5\u5b57\uff0c\u6240\u4ee5server\u6700\u591a\u53ea\u80fd\u8ddf2\u4e2aclient\u901a\u4fe1<\/code><code>int<\/code>&nbsp;<code>z = 0;<\/code><code>void<\/code>&nbsp;<code>thread_fn()<\/code><code>{<\/code><code>\/\/\u6210\u529f\u8fd4\u56de\u975e\u8d1f\u63cf\u8ff0\u5b57\uff0c\u51fa\u9519\u8fd4\u56de-1<\/code><code>int<\/code>&nbsp;<code>conn = accept(ss, (<\/code><code>struct<\/code>&nbsp;<code>sockaddr*)&amp;client_addr, &amp;length);<\/code><code>if<\/code><code>( conn &lt; 0 )<\/code><code>{<\/code><code>perror<\/code><code>(<\/code><code>\"connect\"<\/code><code>);<\/code><code>exit<\/code><code>(1);<\/code><code>}<\/code><code>\/\/\u628a\u8fde\u63a5\u4fdd\u5b58\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d;<\/code><code>conns[z] = conn;<\/code><code>z++;<\/code>&nbsp;<code>fd_set rfds;<\/code><code>struct<\/code>&nbsp;<code>timeval tv;<\/code><code>\/\/linux\u7f16\u7a0b\u4e2d\uff0c\u5982\u679c\u7528\u5230\u8ba1\u65f6\uff0c\u53ef\u4ee5\u7528struct timeval\u83b7\u53d6\u7cfb\u7edf\u65f6\u95f4<\/code><code>int<\/code>&nbsp;<code>retval, maxfd;<\/code><code>while<\/code><code>(1)<\/code><code>{<\/code><code>\/*\u628a\u53ef\u8bfb\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u96c6\u5408\u6e05\u7a7a*\/<\/code><code>FD_ZERO(&amp;rfds);<\/code><code>\/*\u628a\u6807\u51c6\u8f93\u5165\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u52a0\u5165\u5230\u96c6\u5408\u4e2d*\/<\/code><code>FD_SET(0, &amp;rfds);<\/code><code>maxfd = 0;<\/code><code>\/*\u628a\u5f53\u524d\u8fde\u63a5\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u52a0\u5165\u5230\u96c6\u5408\u4e2d*\/<\/code><code>FD_SET(conn, &amp;rfds);<\/code><code>\/*\u627e\u51fa\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408\u4e2d\u6700\u5927\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26*\/<\/code>&nbsp;&nbsp;&nbsp;<code>if<\/code><code>(maxfd &lt; conn)<\/code><code>{<\/code><code>maxfd = conn;<\/code><code>}<\/code><code>\/*\u8bbe\u7f6e\u8d85\u65f6\u65f6\u95f4*\/<\/code><code>tv.tv_sec = 5;<\/code><code>\/\/5\u79d2<\/code><code>tv.tv_usec = 0;<\/code><code>\/*\u7b49\u5f85\u804a\u5929*\/<\/code><code>retval = select(maxfd+1, &amp;rfds, NULL, NULL, &amp;tv);<\/code><code>if<\/code><code>(retval == -1)<\/code><code>{<\/code><code>printf<\/code><code>(<\/code><code>\"select\u51fa\u9519\uff0c\u5ba2\u6237\u7aef\u7a0b\u5e8f\u9000\u51fa\\n\"<\/code><code>);<\/code><code>break<\/code><code>;<\/code><code>}<\/code><code>else<\/code>&nbsp;<code>if<\/code><code>(retval == 0)<\/code><code>{<\/code><code>printf<\/code><code>(<\/code><code>\"\u670d\u52a1\u7aef\u6ca1\u6709\u4efb\u4f55\u8f93\u5165\u4fe1\u606f\uff0c\u5e76\u4e14\u5ba2\u6237\u7aef\u4e5f\u6ca1\u6709\u4fe1\u606f\u5230\u6765\uff0cwaiting...\\n\"<\/code><code>);<\/code><code>continue<\/code><code>;<\/code><code>}<\/code><code>else<\/code><code>{<\/code><code>\/*\u5ba2\u6237\u7aef\u53d1\u6765\u4e86\u6d88\u606f*\/<\/code><code>if<\/code><code>(FD_ISSET(conn,&amp;rfds))<\/code><code>\/\/\u5224\u65adconn\u662f\u5426\u5728rfds\u4e2d\u5982\u679c\u5728\u8fd4\u56de\u975e\u96f6\uff0c\u4e0d\u518d\u8fd4\u56de0<\/code><code>{<\/code><code>char<\/code>&nbsp;<code>buffer[1024];&nbsp;&nbsp;&nbsp;<\/code><code>memset<\/code><code>(buffer, 0 ,<\/code><code>sizeof<\/code><code>(buffer));<\/code><code>\/\/\u628abuffer\u4e2d\u7684\u6240\u6709\u503c\u8d4b\u503c\u4e3a0\uff0c\u5373\u6e05\u7a7abuffer<\/code><code>int<\/code>&nbsp;<code>len = recv(conn, buffer,&nbsp;<\/code><code>sizeof<\/code><code>(buffer), 0);<\/code><code>\/\/\u628a\u63a5\u6536\u5230\u7684\u6570\u636e\u5b58\u653e\u4e8ebuffer\u4e2d<\/code><code>if<\/code><code>(<\/code><code>strcmp<\/code><code>(buffer,&nbsp;<\/code><code>\"exit\\n\"<\/code><code>) == 0)<\/code><code>\/\/\u5982\u679c\u63a5\u53d7\u5230\u7684\u662f\u7a7a\u7684\uff0c\u5373\u6ca1\u6709\u6536\u5230\u4efb\u4f55\u4fe1\u606f<\/code><code>break<\/code><code>;<\/code><code>printf<\/code><code>(<\/code><code>\"%s\"<\/code><code>, buffer);<\/code><code>\/\/send(conn, buffer, len , 0);\u628a\u6570\u636e\u56de\u53d1\u7ed9\u5ba2\u6237\u7aef<\/code><code>}<\/code><code>\/*\u7528\u6237\u8f93\u5165\u4fe1\u606f\u4e86,\u5f00\u59cb\u5904\u7406\u4fe1\u606f\u5e76\u53d1\u9001*\/<\/code><code>if<\/code><code>(FD_ISSET(0, &amp;rfds))<\/code><code>{<\/code><code>char<\/code>&nbsp;<code>buf[1024];<\/code><code>fgets<\/code><code>(buf,&nbsp;<\/code><code>sizeof<\/code><code>(buf), stdin);<\/code><code>\/\/\u6bcf\u6b21\u8bfb\u53d6\u4e00\u884c\u6570\u636e\u5b58\u653e\u5728buf\u4e2d<\/code><code>\/\/printf(\"you are send %s\", buf);<\/code><code>for<\/code><code>(<\/code><code>int<\/code>&nbsp;<code>i=0; i&lt;z; i++)<\/code><code>{<\/code><code>send(conns[i], buf,&nbsp;<\/code><code>sizeof<\/code><code>(buf), 0);<\/code><code>}&nbsp;&nbsp;&nbsp;<\/code><code>}<\/code><code>}<\/code><code>}<\/code><code>close(conn);<\/code><code>}<\/code><code>void<\/code>&nbsp;<code>thread_select(<\/code><code>int<\/code>&nbsp;<code>conn)<\/code><code>{<\/code>&nbsp;<code>}<\/code><code>int<\/code>&nbsp;<code>main()<\/code><code>{<\/code><code>ss = socket(AF_INET, SOCK_STREAM, 0);<\/code><code>\/\/SOCK_STREAM\u5373tcp\u534f\u8bae\uff0cAF_INET\u662fIPv4\u5957\u63a5\u5b57<\/code><code>struct<\/code>&nbsp;<code>sockaddr_in server_sockaddr;<\/code><code>server_sockaddr.sin_family = AF_INET;<\/code><code>server_sockaddr.sin_port = htons(PORT);<\/code><code>\/\/printf(\"%d\\n\",INADDR_ANY);<\/code><code>server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);<\/code><code>if<\/code><code>(bind(ss, (<\/code><code>struct<\/code>&nbsp;<code>sockaddr* ) &amp;server_sockaddr,&nbsp;<\/code><code>sizeof<\/code><code>(server_sockaddr))==-1)<\/code><code>{<\/code><code>perror<\/code><code>(<\/code><code>\"bind\"<\/code><code>);<\/code><code>exit<\/code><code>(1);<\/code><code>}<\/code><code>if<\/code><code>(listen(ss, QUEUE) == -1)<\/code><code>{<\/code><code>perror<\/code><code>(<\/code><code>\"listen\"<\/code><code>);<\/code><code>exit<\/code><code>(1);<\/code><code>}<\/code><code>std::<\/code><code>thread<\/code>&nbsp;<code>t(thread_fn);<\/code><code>\/\/\u56e0\u4e3a\u521b\u5efa\u4e86\u4e24\u4e2a\u7ebf\u7a0b\u6240\u4ee5\u53ea\u80fd\u8fde\u63a5\u4e24\u4e2aclient<\/code><code>std::<\/code><code>thread<\/code>&nbsp;<code>t1(thread_fn);<\/code><code>\/\/\u8fd9\u91cc\u628a\u6536\u53d1\u6570\u636e\u90fd\u5b58\u653e\u5728thread_fn\u4e2d\uff0c\u6240\u4ee5\u521b\u5efa\u4e00\u4e2a\u8fd9\u6837\u7684\u7ebf\u7a0b\u5c31\u80fd\u4f7f\u5f97server\u80fd\u591a\u8fde\u63a5\u4e00\u4e2aserver<\/code><code>t.join();<\/code><code>t1.join();<\/code><code>close(ss);<\/code><code>return<\/code>&nbsp;<code>0;<\/code><code>}<\/code><\/td><\/tr><\/tbody><\/table>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h2_11\">\u5c40\u57df\u7f51TCP2\u4eba\u804a\u5929\u5ba2\u6237\u7aef\u4ee3\u7801\uff1a<\/h2>\n\n\n\n<table class=\"wp-block-table\"><tbody><tr><td>1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586<\/td><td><code>#include &lt;sys\/types.h&gt;<\/code><code>#include &lt;sys\/socket.h&gt;<\/code><code>#include &lt;stdio.h&gt;<\/code><code>#include &lt;netinet\/in.h&gt;<\/code><code>#include &lt;arpa\/inet.h&gt;<\/code><code>#include &lt;unistd.h&gt;<\/code><code>#include &lt;string.h&gt;<\/code><code>#include &lt;stdlib.h&gt;<\/code><code>#include &lt;fcntl.h&gt;<\/code><code>#include &lt;sys\/shm.h&gt;<\/code>&nbsp;<code>#define MYPORT&nbsp; 7000<\/code><code>#define BUFFER_SIZE 1024<\/code><code>int<\/code>&nbsp;<code>main()<\/code><code>{<\/code><code>int<\/code>&nbsp;<code>sock_cli;<\/code><code>fd_set rfds;<\/code><code>struct<\/code>&nbsp;<code>timeval tv;<\/code><code>int<\/code>&nbsp;<code>retval, maxfd;<\/code>&nbsp;<code>\/\/\/\u5b9a\u4e49sockfd<\/code><code>sock_cli = socket(AF_INET,SOCK_STREAM, 0);<\/code><code>\/\/\/\u5b9a\u4e49sockaddr_in<\/code><code>struct<\/code>&nbsp;<code>sockaddr_in servaddr;<\/code><code>memset<\/code><code>(&amp;servaddr, 0,&nbsp;<\/code><code>sizeof<\/code><code>(servaddr));<\/code><code>servaddr.sin_family = AF_INET;<\/code><code>servaddr.sin_port = htons(MYPORT);&nbsp;&nbsp;<\/code><code>\/\/\/\u670d\u52a1\u5668\u7aef\u53e3<\/code><code>servaddr.sin_addr.s_addr = inet_addr(<\/code><code>\"127.0.0.1\"<\/code><code>);&nbsp;&nbsp;<\/code><code>\/\/\/\u670d\u52a1\u5668ip<\/code>&nbsp;<code>\/\/\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u6210\u529f\u8fd4\u56de0\uff0c\u9519\u8bef\u8fd4\u56de-1<\/code><code>if<\/code>&nbsp;<code>(connect(sock_cli, (<\/code><code>struct<\/code>&nbsp;<code>sockaddr *)&amp;servaddr,&nbsp;<\/code><code>sizeof<\/code><code>(servaddr)) &lt; 0)<\/code><code>{<\/code><code>perror<\/code><code>(<\/code><code>\"connect\"<\/code><code>);<\/code><code>exit<\/code><code>(1);<\/code><code>}<\/code>&nbsp;<code>while<\/code><code>(1){<\/code><code>\/*\u628a\u53ef\u8bfb\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u96c6\u5408\u6e05\u7a7a*\/<\/code><code>FD_ZERO(&amp;rfds);<\/code><code>\/*\u628a\u6807\u51c6\u8f93\u5165\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u52a0\u5165\u5230\u96c6\u5408\u4e2d*\/<\/code><code>FD_SET(0, &amp;rfds);<\/code><code>maxfd = 0;<\/code><code>\/*\u628a\u5f53\u524d\u8fde\u63a5\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u52a0\u5165\u5230\u96c6\u5408\u4e2d*\/<\/code><code>FD_SET(sock_cli, &amp;rfds);<\/code><code>\/*\u627e\u51fa\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408\u4e2d\u6700\u5927\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26*\/<\/code>&nbsp;&nbsp;&nbsp;<code>if<\/code><code>(maxfd &lt; sock_cli)<\/code><code>maxfd = sock_cli;<\/code><code>\/*\u8bbe\u7f6e\u8d85\u65f6\u65f6\u95f4*\/<\/code><code>tv.tv_sec = 5;<\/code><code>tv.tv_usec = 0;<\/code><code>\/*\u7b49\u5f85\u804a\u5929*\/<\/code><code>retval = select(maxfd+1, &amp;rfds, NULL, NULL, &amp;tv);<\/code><code>if<\/code><code>(retval == -1)<\/code><code>{<\/code><code>printf<\/code><code>(<\/code><code>\"select\u51fa\u9519\uff0c\u5ba2\u6237\u7aef\u7a0b\u5e8f\u9000\u51fa\\n\"<\/code><code>);<\/code><code>break<\/code><code>;<\/code><code>}<\/code><code>else<\/code>&nbsp;<code>if<\/code><code>(retval == 0)<\/code><code>{<\/code><code>printf<\/code><code>(<\/code><code>\"\u5ba2\u6237\u7aef\u6ca1\u6709\u4efb\u4f55\u8f93\u5165\u4fe1\u606f\uff0c\u5e76\u4e14\u670d\u52a1\u5668\u4e5f\u6ca1\u6709\u4fe1\u606f\u5230\u6765\uff0cwaiting...\\n\"<\/code><code>);<\/code><code>continue<\/code><code>;<\/code><code>}<\/code><code>else<\/code><code>{<\/code><code>\/*\u670d\u52a1\u5668\u53d1\u6765\u4e86\u6d88\u606f*\/<\/code><code>if<\/code><code>(FD_ISSET(sock_cli,&amp;rfds))<\/code><code>{<\/code><code>char<\/code>&nbsp;<code>recvbuf[BUFFER_SIZE];<\/code><code>int<\/code>&nbsp;<code>len;<\/code><code>len = recv(sock_cli, recvbuf,&nbsp;<\/code><code>sizeof<\/code><code>(recvbuf),0);<\/code><code>printf<\/code><code>(<\/code><code>\"%s\"<\/code><code>, recvbuf);<\/code><code>memset<\/code><code>(recvbuf, 0,&nbsp;<\/code><code>sizeof<\/code><code>(recvbuf));<\/code><code>}<\/code><code>\/*\u7528\u6237\u8f93\u5165\u4fe1\u606f\u4e86,\u5f00\u59cb\u5904\u7406\u4fe1\u606f\u5e76\u53d1\u9001*\/<\/code><code>if<\/code><code>(FD_ISSET(0, &amp;rfds))<\/code><code>{<\/code><code>char<\/code>&nbsp;<code>sendbuf[BUFFER_SIZE];<\/code><code>fgets<\/code><code>(sendbuf,&nbsp;<\/code><code>sizeof<\/code><code>(sendbuf), stdin);<\/code><code>send(sock_cli, sendbuf,&nbsp;<\/code><code>strlen<\/code><code>(sendbuf),0);&nbsp;<\/code><code>\/\/\u53d1\u9001<\/code><code>memset<\/code><code>(sendbuf, 0,&nbsp;<\/code><code>sizeof<\/code><code>(sendbuf));<\/code><code>}<\/code><code>}<\/code><code>}<\/code>&nbsp;<code>close(sock_cli);<\/code><code>return<\/code>&nbsp;<code>0;<\/code><code>}<\/code><\/td><\/tr><\/tbody><\/table>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"h1_13\">\u5b8c\u7f8e\u5f02\u6b65\u804a\u5929\u670d\u52a1\u7aef\u548c\u5ba2\u6237\u7aef\u6e90\u7801<\/h1>\n\n\n\n<p>\u4ee5\u4e0a\u7684\u591a\u5ba2\u6237\u804a\u5929\u4e0d\u662f\u5f88\u597d\uff0c \u56e0\u4e3a\u53ea\u5141\u8bb8\u4e24\u4e2a\u5ba2\u6237\u7aef\u8fde\u63a5\uff0c \u4f53\u9a8c\u975e\u5e38\u5dee\uff0c \u5982\u679c\u652f\u6301\u65e0\u9650\u4e2a\u5ba2\u6237\u7aef\u804a\u5929\u7684\u8bdd\u90a3\u8be5\u591a\u597d\u554a\uff0c \u54c8\u54c8\uff0c \u8fd9\u4e2a\u4e5f\u662f\u53ef\u4ee5\u7684\uff0c \u6211\u4eec\u53ea\u8981\u4f7f\u7528c\uff0b\uff0b\u7684list\u5373\u53ef\uff0c \u5b83\u662f\u53ef\u4ee5\u81ea\u589e\u7684\u6570\u7ec4(\u5176\u5b9e\u7b97\u662f\u94fe\u8868)\uff0c \u5f15\u7528 \u5934\u6587\u4ef6&lt;list&gt;\u5373\u53ef\uff1a<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h2_14\">\u65e0\u9650\u4e2a\u5ba2\u6237\u804a\u5929\u7684 \u670d\u52a1\u7aef\u4ee3\u7801\uff1a<\/h2>\n\n\n\n<table class=\"wp-block-table\"><tbody><tr><td>123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127<\/td><td><code>#include &lt;sys\/types.h&gt;<\/code><code>#include &lt;sys\/socket.h&gt;<\/code><code>#include &lt;stdio.h&gt;<\/code><code>#include &lt;netinet\/in.h&gt;<\/code><code>#include &lt;arpa\/inet.h&gt;<\/code><code>#include &lt;unistd.h&gt;<\/code><code>#include &lt;string.h&gt;<\/code><code>#include &lt;stdlib.h&gt;<\/code><code>#include &lt;fcntl.h&gt;<\/code><code>#include &lt;sys\/shm.h&gt;<\/code><code>#include &lt;iostream&gt;<\/code><code>#include &lt;thread&gt;<\/code><code>#include &lt;list&gt;<\/code>&nbsp;<code>#define PORT 7000<\/code><code>#define IP \"127.0.0.1\"<\/code>&nbsp;<code>int<\/code>&nbsp;<code>s;<\/code><code>struct<\/code>&nbsp;<code>sockaddr_in servaddr;<\/code><code>socklen_t len;<\/code><code>std::list&lt;<\/code><code>int<\/code><code>&gt; li;<\/code><code>\/\/\u7528list\u6765\u5b58\u653e\u5957\u63a5\u5b57\uff0c\u6ca1\u6709\u9650\u5236\u5957\u63a5\u5b57\u7684\u5bb9\u91cf\u5c31\u53ef\u4ee5\u5b9e\u73b0\u4e00\u4e2aserver\u8ddf\u82e5\u5e72\u4e2aclient\u901a\u4fe1<\/code>&nbsp;<code>void<\/code>&nbsp;<code>getConn()<\/code><code>{<\/code><code>while<\/code><code>(1)<\/code><code>{<\/code><code>int<\/code>&nbsp;<code>conn = accept(s, (<\/code><code>struct<\/code>&nbsp;<code>sockaddr*)&amp;servaddr, &amp;len);<\/code><code>li.push_back(conn);<\/code><code>printf<\/code><code>(<\/code><code>\"%d\\n\"<\/code><code>, conn);<\/code><code>}<\/code><code>}<\/code>&nbsp;<code>void<\/code>&nbsp;<code>getData()<\/code><code>{<\/code><code>struct<\/code>&nbsp;<code>timeval tv;<\/code><code>tv.tv_sec = 10;<\/code><code>\/\/\u8bbe\u7f6e\u5012\u8ba1\u65f6\u65f6\u95f4<\/code><code>tv.tv_usec = 0;<\/code><code>while<\/code><code>(1)<\/code><code>{<\/code><code>std::list&lt;<\/code><code>int<\/code><code>&gt;::iterator it;<\/code><code>for<\/code><code>(it=li.begin(); it!=li.end(); ++it)<\/code><code>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code>fd_set rfds;&nbsp;&nbsp;&nbsp;<\/code><code>FD_ZERO(&amp;rfds);<\/code><code>int<\/code>&nbsp;<code>maxfd = 0;<\/code><code>int<\/code>&nbsp;<code>retval = 0;<\/code><code>FD_SET(*it, &amp;rfds);<\/code><code>if<\/code><code>(maxfd &lt; *it)<\/code><code>{<\/code><code>maxfd = *it;<\/code><code>}<\/code><code>retval = select(maxfd+1, &amp;rfds, NULL, NULL, &amp;tv);<\/code><code>if<\/code><code>(retval == -1)<\/code><code>{<\/code><code>printf<\/code><code>(<\/code><code>\"select error\\n\"<\/code><code>);<\/code><code>}<\/code><code>else<\/code>&nbsp;<code>if<\/code><code>(retval == 0)<\/code><code>{<\/code><code>\/\/printf(\"not message\\n\");<\/code><code>}<\/code><code>else<\/code><code>{<\/code><code>char<\/code>&nbsp;<code>buf[1024];<\/code><code>memset<\/code><code>(buf, 0 ,<\/code><code>sizeof<\/code><code>(buf));<\/code><code>int<\/code>&nbsp;<code>len = recv(*it, buf,&nbsp;<\/code><code>sizeof<\/code><code>(buf), 0);<\/code><code>printf<\/code><code>(<\/code><code>\"%s\"<\/code><code>, buf);<\/code><code>}<\/code><code>}<\/code><code>sleep(1);<\/code>&nbsp;<code>}<\/code><code>}<\/code>&nbsp;<code>void<\/code>&nbsp;<code>sendMess()<\/code><code>{<\/code><code>while<\/code><code>(1)<\/code><code>{<\/code><code>char<\/code>&nbsp;<code>buf[1024];<\/code><code>fgets<\/code><code>(buf,&nbsp;<\/code><code>sizeof<\/code><code>(buf), stdin);<\/code><code>\/\/printf(\"you are send %s\", buf);<\/code><code>std::list&lt;<\/code><code>int<\/code><code>&gt;::iterator it;<\/code><code>for<\/code><code>(it=li.begin(); it!=li.end(); ++it)<\/code><code>{<\/code><code>send(*it, buf,&nbsp;<\/code><code>sizeof<\/code><code>(buf), 0);<\/code><code>}<\/code><code>}<\/code><code>}<\/code>&nbsp;<code>int<\/code>&nbsp;<code>main()<\/code><code>{<\/code><code>\/\/new socket<\/code><code>s = socket(AF_INET, SOCK_STREAM, 0);<\/code><code>memset<\/code><code>(&amp;servaddr, 0,&nbsp;<\/code><code>sizeof<\/code><code>(servaddr));<\/code><code>servaddr.sin_family = AF_INET;<\/code><code>servaddr.sin_port = htons(PORT);<\/code><code>servaddr.sin_addr.s_addr = inet_addr(IP);<\/code><code>if<\/code><code>(bind(s, (<\/code><code>struct<\/code>&nbsp;<code>sockaddr* ) &amp;servaddr,&nbsp;<\/code><code>sizeof<\/code><code>(servaddr))==-1)<\/code><code>{<\/code><code>perror<\/code><code>(<\/code><code>\"bind\"<\/code><code>);<\/code><code>exit<\/code><code>(1);<\/code><code>}<\/code><code>if<\/code><code>(listen(s, 20) == -1)<\/code><code>{<\/code><code>perror<\/code><code>(<\/code><code>\"listen\"<\/code><code>);<\/code><code>exit<\/code><code>(1);<\/code><code>}<\/code><code>len =&nbsp;<\/code><code>sizeof<\/code><code>(servaddr);<\/code>&nbsp;<code>\/\/thread : while ==&gt;&gt; accpet<\/code><code>std::<\/code><code>thread<\/code>&nbsp;<code>t(getConn);<\/code><code>t.detach();<\/code><code>\/\/detach\u7684\u8bdd\u540e\u9762\u7684\u7ebf\u7a0b\u4e0d\u540c\u7b49\u524d\u9762\u7684\u8fdb\u7a0b\u5b8c\u6210\u540e\u624d\u80fd\u8fdb\u884c\uff0c\u5982\u679c\u8fd9\u91cc\u6539\u4e3ajoin\u5219\u524d\u9762\u7684\u7ebf\u7a0b\u65e0\u6cd5\u5224\u65ad\u7ed3\u675f\uff0c\u5c31\u4f1a<\/code><code>\/\/\u4e00\u76f4\u7b49\u5f85\uff0c\u5bfc\u81f4\u540e\u9762\u7684\u7ebf\u7a0b\u65e0\u6cd5\u8fdb\u884c\u5c31\u65e0\u6cd5\u5b9e\u73b0\u64cd\u4f5c<\/code><code>\/\/printf(\"done\\n\");<\/code><code>\/\/thread : input ==&gt;&gt; send<\/code><code>std::<\/code><code>thread<\/code>&nbsp;<code>t1(sendMess);<\/code><code>t1.detach();<\/code><code>\/\/thread : recv ==&gt;&gt; show<\/code><code>std::<\/code><code>thread<\/code>&nbsp;<code>t2(getData);<\/code><code>t2.detach();<\/code><code>while<\/code><code>(1)<\/code><code>\/\/\u505a\u4e00\u4e2a\u6b7b\u5faa\u73af\u4f7f\u5f97\u4e3b\u7ebf\u7a0b\u4e0d\u4f1a\u63d0\u524d\u9000\u51fa<\/code><code>{<\/code>&nbsp;<code>}<\/code><code>return<\/code>&nbsp;<code>0;<\/code><code>}<\/code><code>\/*\u8fd9\u4e2a\u8ddf\u524d\u9762\u7684\u4e0d\u4e00\u6837\u7684\u5730\u65b9\u662f\uff0c\u628a\u83b7\u5f97\u8fde\u63a5\u5957\u63a5\u5b57getConn\u548c\u53d1\u9001\u4fe1\u606fsendMess\u548c\u63a5\u6536\u4fe1\u606fgetData\u653e\u5728\u4e09\u4e2a\u51fd\u6570\u4e2d\uff0c\u521b\u5efa<\/code><code>\u7684\u4e09\u4e2a\u7ebf\u7a0b\u5206\u522b\u5bf9\u5e94\u5904\u7406\u4e09\u4e2a\u51fd\u6570\uff0c\u5c31\u53ef\u4ee5\u4f7f\u5f97server\u80fd\u8ddf\u82e5\u5e72\u4e2aclient\u901a\u4fe1*\/<\/code><\/td><\/tr><\/tbody><\/table>\n\n\n\n<p>\u95ee\uff1a\u4e3a\u4ec0\u4e48\u8981\u521b\u5efa\u4e09\u4e2a\u7ebf\u7a0b\u53bb\u5904\u7406\u4e09\u4e2a\u51fd\u6570\uff0c\u5355\u4e2a\u7ebf\u7a0b\u5e76\u4e0d\u53ef\u4ee5\u5417\uff0c\u591a\u7ebf\u7a0b\u548c\u5355\u7ebf\u7a0b\u5904\u7406\u8d77\u6765\u6709\u4ec0\u4e48\u4e0d\u540c\uff1f<\/p>\n\n\n\n<p>\u7b54\uff1a\u9996\u5148\uff0c\u8fd9\u91cc\u7528\u5230\u591a\u7ebf\u7a0b\u7684\u76ee\u7684\u662f\u4e3a\u4e86\u63d0\u9ad8\u5904\u7406\u80fd\u529b\uff0c\u51cf\u5c11\u7b49\u5f85\u65f6\u95f4\uff0c\u591a\u7ebf\u7a0b\u53ef\u4ee5\u5e76\u53d1\u6267\u884c\uff0c\u5373\u53ef\u4ee5\u540c\u65f6\u5bf9\u4e09\u4e2a\u51fd\u6570\u8fdb\u884c\u5904\u7406\uff0c\u5904\u7406\u8d77\u6765\u4f1a\u5feb\u5f88\u591a\u3002\u8fd9\u91cc\u4e5f\u662f\u53ef\u4ee5\u7528\u5355\u7ebf\u7a0b\u6765\u5904\u7406\u7684\uff0c\u4f46\u662f\u5355\u7ebf\u7a0b\u6bcf\u6b21\u53ea\u80fd\u505a\u4e00\u4ef6\u4e8b\u60c5\uff0c\u4e0d\u80fd\u540c\u65f6\u53bb\u83b7\u5f97\u8fde\u63a5\u5957\u63a5\u5b57\u3001\u53d1\u9001\u6d88\u606f\u3001\u63a5\u6536\u6d88\u606f\uff0c\u8fd9\u6837\u5728\u505a\u5176\u4e2d\u4e00\u4ef6\u4e8b\u60c5\u7684\u65f6\u5019\u5176\u4ed6\u7684\u4e24\u4ef6\u4e8b\u60c5\u5c31\u8981\u7b49\u5f85\uff0c\u8fd9\u6837\u5904\u7406\u65f6\u95f4\u4f1a\u6bd4\u591a\u7ebf\u7a0b\u6162\u5f88\u591a\u3002\u591a\u7ebf\u7a0b\u53ef\u4ee5\u53ca\u65f6\u7684\u54cd\u5e94\uff0c\u5355\u7ebf\u7a0b\u4e0d\u80fd\u53ca\u65f6\u54cd\u5e94\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h2_15\">\u65e0\u9650\u4e2a\u5ba2\u6237\u7aef\u8fde\u63a5\u7684\u5ba2\u6237\u7aef\u4ee3\u7801\uff1a<\/h2>\n\n\n\n<table class=\"wp-block-table\"><tbody><tr><td>1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980<\/td><td><code>#include &lt;sys\/types.h&gt;<\/code><code>#include &lt;sys\/socket.h&gt;<\/code><code>#include &lt;stdio.h&gt;<\/code><code>#include &lt;netinet\/in.h&gt;<\/code><code>#include &lt;arpa\/inet.h&gt;<\/code><code>#include &lt;unistd.h&gt;<\/code><code>#include &lt;string.h&gt;<\/code><code>#include &lt;stdlib.h&gt;<\/code><code>#include &lt;fcntl.h&gt;<\/code><code>#include &lt;sys\/shm.h&gt;<\/code>&nbsp;<code>#define MYPORT&nbsp; 7000<\/code><code>#define BUFFER_SIZE 1024<\/code><code>int<\/code>&nbsp;<code>main()<\/code><code>{<\/code><code>int<\/code>&nbsp;<code>sock_cli;<\/code><code>fd_set rfds;<\/code><code>struct<\/code>&nbsp;<code>timeval tv;<\/code><code>int<\/code>&nbsp;<code>retval, maxfd;<\/code>&nbsp;<code>\/\/\/\u5b9a\u4e49sockfd<\/code><code>sock_cli = socket(AF_INET,SOCK_STREAM, 0);<\/code><code>\/\/\/\u5b9a\u4e49sockaddr_in<\/code><code>struct<\/code>&nbsp;<code>sockaddr_in servaddr;<\/code><code>memset<\/code><code>(&amp;servaddr, 0,&nbsp;<\/code><code>sizeof<\/code><code>(servaddr));<\/code><code>servaddr.sin_family = AF_INET;<\/code><code>servaddr.sin_port = htons(MYPORT);&nbsp;&nbsp;<\/code><code>\/\/\/\u670d\u52a1\u5668\u7aef\u53e3<\/code><code>servaddr.sin_addr.s_addr = inet_addr(<\/code><code>\"127.0.0.1\"<\/code><code>);&nbsp;&nbsp;<\/code><code>\/\/\/\u670d\u52a1\u5668ip<\/code>&nbsp;<code>\/\/\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u6210\u529f\u8fd4\u56de0\uff0c\u9519\u8bef\u8fd4\u56de-1<\/code><code>if<\/code>&nbsp;<code>(connect(sock_cli, (<\/code><code>struct<\/code>&nbsp;<code>sockaddr *)&amp;servaddr,&nbsp;<\/code><code>sizeof<\/code><code>(servaddr)) &lt; 0)<\/code><code>{<\/code><code>perror<\/code><code>(<\/code><code>\"connect\"<\/code><code>);<\/code><code>exit<\/code><code>(1);<\/code><code>}<\/code>&nbsp;<code>while<\/code><code>(1){<\/code><code>\/*\u628a\u53ef\u8bfb\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u96c6\u5408\u6e05\u7a7a*\/<\/code><code>FD_ZERO(&amp;rfds);<\/code><code>\/*\u628a\u6807\u51c6\u8f93\u5165\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u52a0\u5165\u5230\u96c6\u5408\u4e2d*\/<\/code><code>FD_SET(0, &amp;rfds);<\/code><code>maxfd = 0;<\/code><code>\/*\u628a\u5f53\u524d\u8fde\u63a5\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u52a0\u5165\u5230\u96c6\u5408\u4e2d*\/<\/code><code>FD_SET(sock_cli, &amp;rfds);<\/code><code>\/*\u627e\u51fa\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408\u4e2d\u6700\u5927\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26*\/<\/code>&nbsp;&nbsp;&nbsp;<code>if<\/code><code>(maxfd &lt; sock_cli)<\/code><code>maxfd = sock_cli;<\/code><code>\/*\u8bbe\u7f6e\u8d85\u65f6\u65f6\u95f4*\/<\/code><code>tv.tv_sec = 10;<\/code><code>tv.tv_usec = 0;<\/code><code>\/*\u7b49\u5f85\u804a\u5929*\/<\/code><code>retval = select(maxfd+1, &amp;rfds, NULL, NULL, &amp;tv);<\/code><code>if<\/code><code>(retval == -1){<\/code><code>printf<\/code><code>(<\/code><code>\"select\u51fa\u9519\uff0c\u5ba2\u6237\u7aef\u7a0b\u5e8f\u9000\u51fa\\n\"<\/code><code>);<\/code><code>break<\/code><code>;<\/code><code>}<\/code><code>else<\/code>&nbsp;<code>if<\/code><code>(retval == 0){<\/code><code>printf<\/code><code>(<\/code><code>\"\u5ba2\u6237\u7aef\u6ca1\u6709\u4efb\u4f55\u8f93\u5165\u4fe1\u606f\uff0c\u5e76\u4e14\u670d\u52a1\u5668\u4e5f\u6ca1\u6709\u4fe1\u606f\u5230\u6765\uff0cwaiting...\\n\"<\/code><code>);<\/code><code>continue<\/code><code>;<\/code><code>}<\/code><code>else<\/code><code>{<\/code><code>\/*\u670d\u52a1\u5668\u53d1\u6765\u4e86\u6d88\u606f*\/<\/code><code>if<\/code><code>(FD_ISSET(sock_cli,&amp;rfds)){<\/code><code>char<\/code>&nbsp;<code>recvbuf[BUFFER_SIZE];<\/code><code>int<\/code>&nbsp;<code>len;<\/code><code>len = recv(sock_cli, recvbuf,&nbsp;<\/code><code>sizeof<\/code><code>(recvbuf),0);<\/code><code>printf<\/code><code>(<\/code><code>\"%s\"<\/code><code>, recvbuf);<\/code><code>memset<\/code><code>(recvbuf, 0,&nbsp;<\/code><code>sizeof<\/code><code>(recvbuf));<\/code><code>}<\/code><code>\/*\u7528\u6237\u8f93\u5165\u4fe1\u606f\u4e86,\u5f00\u59cb\u5904\u7406\u4fe1\u606f\u5e76\u53d1\u9001*\/<\/code><code>if<\/code><code>(FD_ISSET(0, &amp;rfds)){<\/code><code>char<\/code>&nbsp;<code>sendbuf[BUFFER_SIZE];<\/code><code>fgets<\/code><code>(sendbuf,&nbsp;<\/code><code>sizeof<\/code><code>(sendbuf), stdin);<\/code><code>send(sock_cli, sendbuf,&nbsp;<\/code><code>strlen<\/code><code>(sendbuf),0);&nbsp;<\/code><code>\/\/\u53d1\u9001<\/code><code>memset<\/code><code>(sendbuf, 0,&nbsp;<\/code><code>sizeof<\/code><code>(sendbuf));<\/code><code>}<\/code><code>}<\/code><code>}<\/code>&nbsp;<code>close(sock_cli);<\/code><code>return<\/code>&nbsp;<code>0;<\/code><code>}<\/code><\/td><\/tr><\/tbody><\/table>\n\n\n<p>https:\/\/www.cnblogs.com\/wuyepeng\/p\/9737583.html<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9605\u8bfb\u76ee\u5f55 \u3000\u3000\u57fa\u672c\u7684\u5c40\u57df\u7f51\u804a\u5929 \u3000\u3000\u5ba2\u6237\u7aef\u670d\u52a1\u7aef\u53cc\u5411\u5f02\u6b65\u804a\u5929\u6e90\u7801 \u3000\u3000\u5c40\u57df\u7f51\u5185\u670d\u52a1\u7aef\u548c\u6709\u9650\u4e2a\u5ba2\u6237\u7aef\u804a\u5929\u6e90\u7801 \u3000<\/p>\n<div class=\"more-link\">\n\t\t\t\t <a href=\"http:\/\/www.inhhh.com\/blog\/?p=432\" class=\"link-btn theme-btn\"><span>Read More <\/span> <i class=\"fa fa-caret-right\"><\/i><\/a>\n\t\t\t<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-432","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/www.inhhh.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/432","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.inhhh.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.inhhh.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.inhhh.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.inhhh.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=432"}],"version-history":[{"count":2,"href":"http:\/\/www.inhhh.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/432\/revisions"}],"predecessor-version":[{"id":435,"href":"http:\/\/www.inhhh.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/432\/revisions\/435"}],"wp:attachment":[{"href":"http:\/\/www.inhhh.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=432"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.inhhh.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=432"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.inhhh.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=432"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}