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

VC6.0 Winsock 編程入門:TCP 服務端與客戶端完整示例

     編輯:關於C語言

Winsock 是 Windows 平台網絡編程的基石。本文提供最精簡的 TCP 服務端/客戶端配對代碼,涵蓋初始化、套接字創建、綁定/連接、收發數據、清理全流程,適合快速上手驗證網絡通信。

服務端

// server.cpp
#include 
#include 
#pragma comment(lib, "ws2_32.lib")

void main() {
    // 1. 初始化 Winsock
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR) {
        printf("WSAStartup failed\n");
        return;
    }

    // 2. 創建套接字
    SOCKET server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (server == INVALID_SOCKET) {
        printf("socket failed: %ld\n", WSAGetLastError());
        WSACleanup();
        return;
    }

    // 3. 綁定地址端口
    sockaddr_in service = {0};
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr("127.0.0.1");
    service.sin_port = htons(27015);

    if (bind(server, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR) {
        printf("bind failed\n");
        closesocket(server);
        WSACleanup();
        return;
    }

    // 4. 監聽
    if (listen(server, 1) == SOCKET_ERROR) {
        printf("listen failed\n");
        closesocket(server);
        WSACleanup();
        return;
    }

    // 5. 接受連接
    printf("Waiting for client...\n");
    SOCKET client = accept(server, NULL, NULL);
    if (client == INVALID_SOCKET) {
        printf("accept failed\n");
        closesocket(server);
        WSACleanup();
        return;
    }
    printf("Client connected.\n");
    closesocket(server);  // 單連接示例,關閉監聽套接字

    // 6. 收發數據
    char recvBuf[32] = "", sendBuf[32] = "Server: Sending Data.";
    int bytesRecv = recv(client, recvBuf, 32, 0);
    printf("Bytes received: %ld\n", bytesRecv);
    
    int bytesSent = send(client, sendBuf, strlen(sendBuf), 0);
    printf("Bytes sent: %ld\n", bytesSent);

    closesocket(client);
    WSACleanup();
}

客戶端

// client.cpp
#include 
#include 
#pragma comment(lib, "ws2_32.lib")

void main() {
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR) {
        printf("WSAStartup failed\n");
        return;
    }

    SOCKET client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (client == INVALID_SOCKET) {
        printf("socket failed: %ld\n", WSAGetLastError());
        WSACleanup();
        return;
    }

    sockaddr_in serverAddr = {0};
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    serverAddr.sin_port = htons(27015);

    if (connect(client, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
        printf("connect failed\n");
        closesocket(client);
        WSACleanup();
        return;
    }

    char sendBuf[32] = "Client: Sending data.";
    char recvBuf[32] = "";
    
    int bytesSent = send(client, sendBuf, strlen(sendBuf), 0);
    printf("Bytes sent: %ld\n", bytesSent);

    int bytesRecv = recv(client, recvBuf, 32, 0);
    if (bytesRecv > 0) printf("Bytes received: %ld\n", bytesRecv);
    else if (bytesRecv == 0) printf("Connection closed\n");
    else printf("recv failed: %d\n", WSAGetLastError());

    closesocket(client);
    WSACleanup();
}

關鍵點速記

步驟服務端客戶端
1WSAStartupWSAStartup
2socket()socket()
3bind()connect()
4listen()-
5accept()-
6recv/sendsend/recv
7closesocket + WSACleanupclosesocket + WSACleanup

常見錯誤碼

  • WSAEADDRINUSE (10048):端口被佔用(TIME_WAIT 狀態),可用 SO_REUSEADDR
  • WSAECONNREFUSED (10061):服務端未啟動/端口錯誤/防火牆攔截
  • WSAETIMEDOUT (10060):連接超時(網絡不通/防火牆/服務端未 accept)
  • WSAECONNRESET (10054):對端強制關閉(RST 包)

進階擴展方向

  1. 多客戶端:accept 循環 + CreateThread/_beginthreadex/IOCP/Select 模型
  2. 非阻塞/異步:ioctlsocket(FIONBIO) / WSAAsyncSelect / WSAEventSelect / IOCP
  3. 協議幀處理:長度前綴 / 分隔符 / 固定長度 / Protobuf
  4. SSL/TLS:OpenSSL / Schannel 升級為安全通道

現代化提示

VC6.0 (1998) 及 Winsock 1.1/2.0 已屬歷史。新項目請使用:
  • Visual Studio 2022 + Windows SDK(原生支援 C++20、WS2_32 完整 API)
  • Boost.Asio(跨平台、現代 C++、協程支援、高性能 Proactor 模式)
  • libcurl / cpp-httplib(HTTP/HTTPS 客戶端)
  • gRPC / ZeroMQ / nanomsg(高層 RPC/消息模式)
本示例僅供教學驗證 TCP 基礎流程,生產環境請選用成熟框架。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved