{"id":189,"date":"2025-10-18T18:03:37","date_gmt":"2025-10-18T10:03:37","guid":{"rendered":"http:\/\/47.99.178.170\/?p=189"},"modified":"2025-10-18T18:25:46","modified_gmt":"2025-10-18T10:25:46","slug":"%e3%80%90%e8%ae%a1%e7%ae%97%e6%9c%ba%e7%bd%91%e7%bb%9c%e3%80%91socket3-%e8%bf%9b%e7%a8%8b%e9%97%b4%e9%80%9a%e4%bf%a1demo","status":"publish","type":"post","link":"https:\/\/www.garfield-blog.top\/?p=189","title":{"rendered":"\u3010\u8ba1\u7b97\u673a\u7f51\u7edc\u3011socket(3) \u8fdb\u7a0b\u95f4\u901a\u4fe1demo"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u521b\u5efa\u6587\u4ef6<\/h2>\n\n\n\n<p>\u521b\u5efa\u6587\u4ef6\u5e76\u5df2\u5982\u4e0b\u5f62\u5f0f\u653e\u7f6e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\nclient.cpp\nserver.cpp<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u6587\u4ef6\u5185\u5bb9<\/h2>\n\n\n\n<p><strong>client.cpp<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;iostream&gt;\n#include &lt;cstring&gt;\n#include &lt;unistd.h&gt;\n#include &lt;arpa\/inet.h&gt;\n#include &lt;sys\/socket.h&gt;\n\n#define SERVER_IP \"127.0.0.1\"\n#define PORT 12345\n#define BUFFER_SIZE 1024\n\nint client_sock;\n\nbool create_server_connect()\n{\n    int ret;\n    struct sockaddr_in server_addr;\n\n    \/\/ \u521b\u5efa\u5ba2\u6237\u7aef\u5957\u63a5\u5b57\n    client_sock = socket(AF_INET, SOCK_STREAM, 0);\n    if (client_sock &lt; 0) {\n        perror(\"Socket creation failed\");\n        return false;\n    }\n\n    memset(&amp;server_addr, 0, sizeof(server_addr));\n    server_addr.sin_family = AF_INET;\n    server_addr.sin_port = htons(PORT);\n\n    \/\/ \u5c06\u670d\u52a1\u5668\u7684 IP \u5730\u5740\u8f6c\u6362\u4e3a\u7f51\u7edc\u5b57\u8282\u5e8f\n    ret = inet_pton(AF_INET, SERVER_IP, &amp;server_addr.sin_addr);\n    if (ret &lt;= 0) {\n        perror(\"Invalid address or address not supported\");\n        close(client_sock);\n        return false;\n    }\n\n    \/\/ \u8fde\u63a5\u5230\u670d\u52a1\u5668\n    ret = connect(client_sock, (struct sockaddr *)&amp;server_addr, sizeof(server_addr));\n    if (ret &lt; 0) {\n        perror(\"Connection failed\");\n        close(client_sock);\n        return false;\n    }\n\n    return true;\n}\n\nbool send_data(const char *message)\n{\n    ssize_t sent_bytes;\n\n    sent_bytes = send(client_sock, message, strlen(message), 0);\n    if (sent_bytes &lt; 0) {\n        perror(\"Send failed\");\n        close(client_sock);\n        return false;\n    }\n\n    return true;\n}\n\nbool recv_socket_data(char *buffer, int buff_len)\n{\n    ssize_t received_bytes;\n    struct sockaddr_in client_addr;\n    socklen_t client_addr_len = sizeof(client_addr);\n\n    \/\/ \u63a5\u6536\u5ba2\u6237\u7aef\u6570\u636e\n    memset(buffer, '\\0', buff_len);\n    received_bytes = recv(client_sock, buffer, buff_len - 1, 0);\n    if (received_bytes &lt; 0) {\n        perror(\"Receive failed\");\n        close(client_sock);\n        return false;\n    }\n\n    buffer&#91;received_bytes] = '\\0';  \/\/ \u9632\u6b62\u6570\u7ec4\u8d8a\u754c\n\n    return true;\n}\n\nint main()\n{\n    bool ret;\n    char buffer&#91;BUFFER_SIZE];\n    const char *message = \"Hello, Server!\";\n\n    ret = create_server_connect();\n    if (!ret) {\n        return -1;\n    }\n    std::cout &lt;&lt; \"Connected to server.\\n\";\n\n    ret = send_data(message);\n    if (!ret) {\n        return -1;\n    }\n    std::cout &lt;&lt; \"Message sent to server: \" &lt;&lt; message &lt;&lt; \"\\n\";\n\n    \/\/ \u63a5\u6536\u670d\u52a1\u5668\u54cd\u5e94\n    ret = recv_socket_data(buffer ,sizeof(buffer));\n    if (!ret) {\n        return -1;\n    }\n    std::cout &lt;&lt; \"Received from server: \" &lt;&lt; buffer &lt;&lt; std::endl;\n\n    \/\/ \u5173\u95ed\u5ba2\u6237\u7aef\u5957\u63a5\u5b57\n    close(client_sock);\n\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p><strong>server.cpp<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;iostream&gt;\n#include &lt;cstring&gt;\n#include &lt;unistd.h&gt;\n#include &lt;arpa\/inet.h&gt;\n#include &lt;sys\/socket.h&gt;\n\n#define PORT 12345\n#define BUFFER_SIZE 1024\n\nint server_sock, client_sock;\n\nbool create_socket_listen()\n{\n    struct sockaddr_in server_addr;\n    int ret = 0;\n\n    \/\/ \u521b\u5efa\u670d\u52a1\u5668\u5957\u63a5\u5b57\n    server_sock = socket(AF_INET, SOCK_STREAM, 0);\n    if (server_sock &lt; 0) {\n        perror(\"Socket creation failed\");\n        return false;\n    }\n\n    \/\/ \u914d\u7f6e\u670d\u52a1\u5668\u5730\u5740\n    memset(&amp;server_addr, 0, sizeof(server_addr));\n    server_addr.sin_family = AF_INET;\n    server_addr.sin_addr.s_addr = INADDR_ANY;\n    server_addr.sin_port = htons(PORT);\n\n    \/\/ \u7ed1\u5b9a\u5957\u63a5\u5b57\u5230\u6307\u5b9a\u7aef\u53e3\n    ret = bind(server_sock, (struct sockaddr *)&amp;server_addr, sizeof(server_addr));\n    if (ret &lt; 0) {\n        perror(\"Bind failed\");\n        close(server_sock);\n        return false;\n    }\n\n    \/\/ \u8fdb\u5165\u76d1\u542c\u72b6\u6001\n    ret = listen(server_sock, 5);\n    if (ret &lt; 0) {\n        perror(\"Listen failed\");\n        close(server_sock);\n        return false;\n    }\n\n    return true;\n}\n\nbool recv_socket_data(int server_sock, char *buffer, int buff_len)\n{\n    ssize_t received_bytes;\n    struct sockaddr_in client_addr;\n    socklen_t client_addr_len = sizeof(client_addr);\n\n    \/\/ \u63a5\u53d7\u5ba2\u6237\u7aef\u8fde\u63a5\n    client_sock = accept(server_sock, (struct sockaddr *)&amp;client_addr, &amp;client_addr_len);\n    if (client_sock &lt; 0) {\n        perror(\"Accept failed\");\n        close(server_sock);\n        return false;\n    }\n\n    \/\/ \u63a5\u6536\u5ba2\u6237\u7aef\u6570\u636e\n    memset(buffer, '\\0', buff_len);\n    received_bytes = recv(client_sock, buffer, buff_len - 1, 0);\n    if (received_bytes &lt; 0) {\n        perror(\"Receive failed\");\n        close(client_sock);\n        close(server_sock);\n        return false;\n    }\n\n    buffer&#91;received_bytes] = '\\0';  \/\/ \u9632\u6b62\u6570\u7ec4\u8d8a\u754c\n\n    return true;\n}\n\nbool send_respond(const char *response)\n{\n    ssize_t buff_len;\n\n    buff_len = send(client_sock, response, strlen(response), 0); \/\/ \u53d1\u9001\u54cd\u5e94\u6570\u636e\n    if (buff_len == -1) {\n        return false;\n    }\n\n    return true;\n}\n\nint main()\n{\n    bool ret;\n    char buffer&#91;BUFFER_SIZE] = {0};\n    const char *response = \"Hello, Client!\";\n\n    std::cout &lt;&lt; \"Server start\" &lt;&lt; std::endl;\n    ret = create_socket_listen();\n    if (!ret) {\n        return -1;\n    }\n    std::cout &lt;&lt; \"Server listening on port \" &lt;&lt; PORT &lt;&lt; \"...\\n\";\n\n    ret = recv_socket_data(server_sock, buffer, sizeof(buffer));\n    if (!ret) {\n        return -1;\n    }\n    std::cout &lt;&lt; \"Received from client: \" &lt;&lt; buffer &lt;&lt; std::endl;\n\n    ret = send_respond(response);\n    if (!ret) {\n        return -1;\n    }\n\n    close(server_sock);\n    close(client_sock);\n\n    return 0;\n}\n<\/code><\/pre>\n\n\n\n<p>\u7a0b\u5e8f\u5206\u4e3a<code>server<\/code>\u7aef\uff0c\u548c<code>client<\/code>\u7aef\uff0c\u4f7f\u7528<code>socket<\/code>\u8fdb\u884c\u901a\u4fe1\uff0c\u7aef\u53e3\u4f7f\u7528<code>12345<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u7f16\u8bd1<\/h2>\n\n\n\n<p>\u6267\u884c\u5982\u4e0b\u4ee3\u7801\u8fdb\u884c\u7f16\u8bd1<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>g++ server.cpp -o server\ng++ client.cpp -o client<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u8fd0\u884c<\/h2>\n\n\n\n<p>\u5206\u522b\u5728\u4e24\u4e2a\u7ec8\u7aef\u6267\u884c<br>\u9996\u5148\u8fd0\u884c<code>server<\/code>\u7aef<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/server<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u8fd0\u884c<code>client<\/code>\u7aef<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/client<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u7ed3\u679c<\/h2>\n\n\n\n<p><code>server<\/code>\u7aef\u7684\u7ec8\u7aef\u53ef\u89c1\u6253\u5370\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Server start<br>Server listening on port 12345...<br>Received from client: Hello, Server!<\/code><\/pre>\n\n\n\n<p><code>client<\/code>\u7aef\u7684\u7ec8\u7aef\u53ef\u89c1\u6253\u5370\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Connected to server.<br>Message sent to server: Hello, Server!<br>Received from server: Hello, Client!<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u521b\u5efa\u6587\u4ef6 \u521b\u5efa\u6587\u4ef6\u5e76\u5df2\u5982\u4e0b\u5f62\u5f0f\u653e\u7f6e \u6587\u4ef6\u5185\u5bb9 client.cpp server.cpp \u7a0b\u5e8f\u5206\u4e3aserver [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[10],"tags":[],"class_list":["post-189","post","type-post","status-publish","format-standard","hentry","category-10"],"_links":{"self":[{"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=\/wp\/v2\/posts\/189","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=189"}],"version-history":[{"count":6,"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=\/wp\/v2\/posts\/189\/revisions"}],"predecessor-version":[{"id":197,"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=\/wp\/v2\/posts\/189\/revisions\/197"}],"wp:attachment":[{"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}