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

Windows Socket 網路程式設計完整入門與範例碼

     編輯:關於C++

Windows Socket 概述

Windows Sockets (Winsock) 是 Microsoft 實作的網路程式介面,源自 Berkeley Sockets,以動態連結庫 (DLL) 形式提供。支援三種套接字類型:

  • 串流套接字 (SOCK_STREAM):TCP,面向連線、可靠、有序傳輸。
  • 資料報套接字 (SOCK_DGRAM):UDP,無連線、不可靠、可能丟包/亂序。
  • 原始套接字 (SOCK_RAW):直接存取協定層,用於 ICMP、IGMP 等。

TCP Client/Server 架構流程

伺服器端步驟

  1. socket() 建立套接字
  2. bind() 繫結本地 IP 與連接埠
  3. listen() 進入監聽狀態
  4. accept() 接受客戶端連線,取得新套接字
  5. send()/recv() 資料收發
  6. 迴圈等待下一個連線
  7. closesocket() 關閉套接字

客戶端步驟

  1. socket() 建立套接字
  2. connect() 連線至伺服器
  3. send()/recv() 資料收發
  4. closesocket() 關閉套接字

程式流程圖

完整伺服器端程式碼

// server.cpp
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
using namespace std;

void main() {
    WORD wVersionRequested = MAKEWORD(1, 1);
    WSADATA wsaData;
    int err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0 || LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) {
        WSACleanup(); return;
    }

    SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(6000);
    bind(sockSrv, (sockaddr*)&addrSrv, sizeof(SOCKADDR));
    listen(sockSrv, 5);

    SOCKADDR_IN addrClient;
    int len = sizeof(SOCKADDR);
    char revBuf[100], sendBuf[100];

    while (1) {
        SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
        cout << "我說:\n";
        cin >> sendBuf;
        send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);
        recv(sockConn, revBuf, 100, 0);
        cout << "對方說:\n" << revBuf << endl;
        memset(revBuf, 0, 100);
        closesocket(sockConn);
    }
    closesocket(sockSrv);
}

完整客戶端程式碼

// client.cpp
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
using namespace std;

void main() {
    WORD wVersionRequested = MAKEWORD(1, 1);
    WSADATA wsaData;
    int err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0 || LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) {
        WSACleanup(); return;
    }

    SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(6000);
    connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

    char recvBuf[100], sendBuf[100];
    while (true) {
        recv(sockClient, recvBuf, 100, 0);
        cout << "對方說:" << recvBuf << endl;
        memset(recvBuf, 0, 100);
        cout << "我說:";
        cin >> sendBuf;
        send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);
    }
    closesocket(sockClient);
    WSACleanup();
}

關鍵點提醒

  • 必須呼叫 WSAStartup 初始化,結束前呼叫 WSACleanup 釋放資源。
  • 使用 htonl/htons 處理網路位元組序轉換。
  • 生產環境需加入錯誤處理、非阻塞模式、多執行緒/IO 多工(select/IOCP)等機制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved