首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

UDP 協定通訊程式設計完整範例:Server/Client 架構

     編輯:關於VC++

UDP 為無連線、不可靠但傳輸效率高的協定,適合即時性要求高、容許少量丟包的場景。本文提供完整 Server/Client 通訊範例代碼。

UDP 通訊流程對比

角色流程
Serversocket → bind → sendto/recvfrom → closesocket
Clientsocket → sendto/recvfrom → closesocket

無需 listen/connect,Server/Client 界限模糊,雙方均可主動收發資料,但不保證可靠性與順序。

Server 端核心代碼


void main() {
    SOCKET socket1;
    InitWinsock();
    struct sockaddr_in local, from;
    int fromlen = sizeof(from);
    local.sin_family = AF_INET;
    local.sin_port = htons(1000);        // 監聽埠
    local.sin_addr.s_addr = INADDR_ANY;  // 本機所有介面
    socket1 = socket(AF_INET, SOCK_DGRAM, 0);
    bind(socket1, (struct sockaddr*)&local, sizeof(local));

    while (1) {
        char buffer[1024] = "\0";
        printf("waiting for message from others-------------\n");
        if (recvfrom(socket1, buffer, sizeof(buffer), 0,
            (struct sockaddr*)&from, &fromlen) != SOCKET_ERROR) {
            printf("Received datagram from %s--%s\n",
                inet_ntoa(from.sin_addr), buffer);
            // 回送資料給 Client
            sendto(socket1, buffer, sizeof(buffer), 0,
                (struct sockaddr*)&from, fromlen);
        }
        Sleep(500);
    }
    closesocket(socket1);
}

Client 端核心代碼


void main() {
    SOCKET socket1;
    InitWinsock();
    struct sockaddr_in server;
    int len = sizeof(server);
    server.sin_family = AF_INET;
    server.sin_port = htons(1000);                    // Server 埠
    server.sin_addr.s_addr = inet_addr("168.168.0.10"); // Server IP
    socket1 = socket(AF_INET, SOCK_DGRAM, 0);

    while (1) {
        char buffer[1024] = "\0";
        printf("input message\n");
        scanf("%s", buffer);
        if (strcmp(buffer, "bye") == 0) break;
        if (sendto(socket1, buffer, sizeof(buffer), 0,
            (struct sockaddr*)&server, len) != SOCKET_ERROR) {
            if (recvfrom(socket1, buffer, sizeof(buffer), 0,
                (struct sockaddr*)&server, &len) != SOCKET_ERROR)
                printf("rece from server:%s\n", buffer);
        }
    }
    closesocket(socket1);
}

關鍵函式說明

  • sendto:指定目標位址發送資料報
  • recvfrom:接收資料報並取得來源位址
  • SOCK_DGRAM:資料報 Socket 類型(UDP)

應用場景建議

  • 即時遊戲狀態同步
  • 影音串流傳輸
  • 廣播/多播訊息分發
  • 簡易日誌收集

總結

UDP 程式設計比 TCP 簡潔許多,在不要求絕對可靠傳輸的場合極具價值。完整專案請參考配套源碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved