<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 網絡,第 3 部分:構建一個簡單的 TCP 客戶端 > 原文:<https://github.com/angrave/SystemProgramming/wiki/Networking%2C-Part-3%3A-Building-a-simple-TCP-Client> ## `socket` `int socket(int domain, int type, int protocol);` Socket 創建一個帶域的套接字(通常是用于 IPv4 的 AF_INET),類型是使用 UDP 還是 TCP,協議是任何添加選項。這在內核中創建了一個套接字對象,可以與外部世界/網絡進行通信。這將返回一個 fd,因此您可以像普通文件描述符一樣使用它!請記住,您希望從 socketfd 執行讀取或寫入操作,因為它僅將套接字對象表示為客戶端,否則您需要遵守服務器的約定。 ## `getaddressinfo` 我們在最后一節看到了這個!你是這方面的專家。 ## `connect` `int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);` 將它傳遞給 sockfd,然后傳遞你要去的地址和它的長度,你就會斷開連接(只要你檢查錯誤)。請記住,網絡呼叫是非常容易失敗的。 ## `read` / `write` 一旦我們成功連接,我們可以像任何舊的文件描述符一樣讀取或寫入。請記住,如果您連接到網站,您希望符合 HTTP 協議規范,以便獲得任何有意義的結果。有一些庫可以做到這一點,通常你不會在套接字級別連接,因為它周圍有其他庫或包 ## 完整的簡單 TCP 客戶端示例 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <unistd.h> int main(int argc, char **argv) { int s; int sock_fd = socket(AF_INET, SOCK_STREAM, 0); struct addrinfo hints, *result; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_INET; /* IPv4 only */ hints.ai_socktype = SOCK_STREAM; /* TCP */ s = getaddrinfo("www.illinois.edu", "80", &hints, &result); if (s != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s)); exit(1); } if(connect(sock_fd, result->ai_addr, result->ai_addrlen) == -1){ perror("connect"); exit(2); } char *buffer = "GET / HTTP/1.0\r\n\r\n"; printf("SENDING: %s", buffer); printf("===\n"); write(sock_fd, buffer, strlen(buffer)); char resp[1000]; int len = read(sock_fd, resp, 999); resp[len] = '\0'; printf("%s\n", resp); return 0; } ``` 示例輸出: ``` SENDING: GET / HTTP/1.0 === HTTP/1.1 200 OK Date: Mon, 27 Oct 2014 19:19:05 GMT Server: Apache/2.2.15 (Red Hat) mod_ssl/2.2.15 OpenSSL/1.0.1e-fips mod_jk/1.2.32 Last-Modified: Fri, 03 Feb 2012 16:51:10 GMT ETag: "401b0-49-4b8121ea69b80" Accept-Ranges: bytes Content-Length: 73 Connection: close Content-Type: text/html Provided by Web Services at Public Affairs at the University of Illinois ``` ## 評論 HTTP 請求和響應 上面的示例演示了使用超文本傳輸??協議向服務器發出的請求。使用以下請求請求網頁(或其他資源): ``` GET / HTTP/1.0 ``` 有四個部分(方法,例如 GET,POST,......);資源(例如/ /index.html /image.png); procigocol“HTTP / 1.0”和兩個新行(\ r \ n \ r \ n) 服務器的第一個響應行描述了使用的 HTTP 版本以及使用 3 位數響應代碼的請求是否成功: ``` HTTP/1.1 200 OK ``` 如果客戶端請求了非現有文件,例如`GET /nosuchfile.html HTTP/1.0`然后第一行包含響應代碼是眾所周知的`404`響應代碼: ``` HTTP/1.1 404 Not Found ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看