<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 網絡,第 6 部分:創建 UDP 服務器 > 原文:<https://github.com/angrave/SystemProgramming/wiki/Networking%2C-Part-6%3A-Creating-a-UDP-server> ## 如何創建 UDP 服務器? 有多種函數調用可用于發送 UDP 套接字。我們將使用較新的 getaddrinfo 來幫助設置套接字結構。 請記住,UDP 是一種簡單的基于數據包('data-gram')協議;兩個主機之間沒有建立連接。 首先,初始化提示 addrinfo 結構以請求 IPv6 被動數據報套接字。 ```c memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET6; // INET for IPv4 hints.ai_socktype = SOCK_DGRAM; hints.ai_flags = AI_PASSIVE; ``` 接下來,使用 getaddrinfo 指定端口號(我們不需要指定主機,因為我們正在創建服務器套接字,而不是將數據包發送到遠程主機)。 ```c getaddrinfo(NULL, "300", &hints, &res); sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); bind(sockfd, res->ai_addr, res->ai_addrlen); ``` 端口號&lt;1024,因此程序將需要`root`權限。我們也可以指定服務名稱而不是數字端口值。 到目前為止,調用類似于 TCP 服務器。對于基于流的服務,我們將調用`listen`并接受。對于我們的 UDP 服務,我們可以開始等待數據包到達套接字 - ```c struct sockaddr_storage addr; int addrlen = sizeof(addr); // ssize_t recvfrom(int socket, void* buffer, size_t buflen, int flags, struct sockaddr *addr, socklen_t * address_len); byte_count = recvfrom(sockfd, buf, sizeof(buf), 0, &addr, &addrlen); ``` addr 結構將保存有關到達數據包的發送方(源)信息。注意`sockaddr_storage`類型足夠大,可以容納所有可能類型的套接字地址(例如 IPv4,IPv6 和其他套接字類型)。 ## 完整代碼 ```c #include <string.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <unistd.h> #include <arpa/inet.h> int main(int argc, char **argv) { int s; struct addrinfo hints, *result; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET6; // INET for IPv4 hints.ai_socktype = SOCK_DGRAM; hints.ai_flags = AI_PASSIVE; getaddrinfo(NULL, "300", &hints, &res); int sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (bind(sockfd, res->ai_addr, res->ai_addrlen) != 0) { perror("bind()"); exit(1); } struct sockaddr_storage addr; int addrlen = sizeof(addr); while(1){ char buffer[1000]; ssize_t byte_count = recvfrom(sockfd, buf, sizeof(buf), 0, &addr, &addrlen); buffer[byte_count] = '\0'; } printf("Read %d chars\n", len); printf("===\n"); printf("%s\n", buffer); return 0; } ```
                  <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>

                              哎呀哎呀视频在线观看