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

Windows 網絡編程入門:Winsock TCP/UDP 客戶端/服務端完整實現

     編輯:關於C

網絡編程兩大模型

特性TCP (SOCK_STREAM)UDP (SOCK_DGRAM)
連接類型面向連接無連接
傳輸單位字節流數據報
可靠性可靠、有序不可靠、無序
適用場景文件傳輸、郵件、Web即時通訊、視頻流、DNS

Winsock 初始化(雙方必做)

WORD wVersionRequested = MAKEWORD(2, 2);
WSADATA wsaData;
int err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0 || LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
    WSACleanup();
    return;
}
#pragma comment(lib, "ws2_32.lib")  // 鏈接庫

TCP 服務端流程

  1. socket(AF_INET, SOCK_STREAM, 0) 創建套接字
  2. bind 綁定 IP:PORT(INADDR_ANY 監聽所有網卡)
  3. listen 進入監聽狀態
  4. accept 阻塞等待客戶端,返回新套接字
  5. send/recv 雙向通信
  6. 循環 accept 處理多客戶端
  7. closesocket + WSACleanup

TCP 客戶端流程

  1. socket 創建
  2. connect 連接服務端 IP:PORT
  3. send/recv 通信
  4. closesocket + WSACleanup

關鍵結構體與字節序轉換

SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(6000);           // 主機序→網絡序 (short)
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  // 長整型轉換
// 或 inet_addr("127.0.0.1") 字符串→網絡序
  • htons/htonl:主機序→網絡序(大端)
  • ntohs/ntohl:網絡序→主機序
  • inet_ntoa:in_addr → 點分十進制字符串

完整 TCP 服務端代碼

#include <Winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")

void main() {
    WSAData wsaData; WSAStartup(MAKEWORD(2,2), &wsaData);
    SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);

    SOCKADDR_IN addrSrv = {AF_INET, htons(6000), {htonl(INADDR_ANY)}};
    bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(addrSrv));
    listen(sockSrv, 5);

    SOCKADDR_IN addrClient; int len = sizeof(addrClient);
    while (1) {
        SOCKET sockCon = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
        char sendBuf[100];
        sprintf(sendBuf, "Welcome %s", inet_ntoa(addrClient.sin_addr));
        send(sockCon, sendBuf, strlen(sendBuf)+1, 0);
        char recvBuf[100];
        recv(sockCon, recvBuf, 100, 0);
        printf("%s\n", recvBuf);
        closesocket(sockCon);
    }
    WSACleanup();
}

UDP 服務端/客戶端區別

  • 無 listen/accept/connect
  • 使用 sendto/recvfrom 攜帶目標/來源地址
  • socket 類型為 SOCK_DGRAM

運行效果圖

TCP 運行結果 UDP 運行結果

常見坑點提醒

  1. 忘記 WSAStartup/WSACleanup 配對
  2. 端口號未 htons 導致綁定失敗
  3. send/recv 長度參數錯誤(含 \0 需 +1)
  4. TCP 粘包/拆包問題需應用層協議解決
  5. UDP 最大數據報 64KB,超大數據需分片
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved