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

VC++ Socket 網絡編程入門 - TCP/UDP 客戶端服務器完整示例

     編輯:C++ 入門

1. 網絡基礎概念

  • IP 地址:主機標識(如總機號碼)。
  • 端口:進程標識(如分機號碼),0-1023 為保留端口,用戶程序用 >1024。
  • 協議:TCP(面向連接、可靠、流式)、UDP(無連接、不可靠、數據報)。
  • Socket:應用層與傳輸層的接口,綁定 IP+端口後可通信。

2. Windows Socket API 核心函數

函數用途
WSAStartup加載 Winsock 庫,協商版本
socket創建套接字,指定 AF_INET, SOCK_STREAM/DGRAM
bind綁定本地 IP 和端口
listen將套接字設為監聽狀態 (TCP 服務器)
accept接受客戶端連接,返回新套接字 (TCP 服務器)
connect向服務器發起連接 (TCP 客戶端)
send/recv發送/接收數據 (TCP)
sendto/recvfrom發送/接收數據報 (UDP)
closesocket關閉套接字
WSACleanup釋放 Winsock 庫
htons/htonl主機字節序轉網絡字節序 (大端)
inet_addr/inet_ntoaIP 字符串與無符號長整數轉換

3. TCP 服務器流程

// 初始化
WSAStartup(MAKEWORD(2,2), &wsaData);
// 創建套接字
SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// 綁定
sockaddr_in sin; sin.sin_family=AF_INET; sin.sin_port=htons(6000); sin.sin_addr.S_un.S_addr=INADDR_ANY;
bind(sListen, (sockaddr*)&sin, sizeof(sin));
// 監聽
listen(sListen, 5);
// 循環接受
while (true) {
    sockaddr_in clientAddr; int addrLen = sizeof(clientAddr);
    SOCKET sClient = accept(sListen, (sockaddr*)&clientAddr, &addrLen);
    // 通信 send/recv
    closesocket(sClient);
}
closesocket(sListen);
WSACleanup();

4. TCP 客戶端流程

WSAStartup(...);
SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in srv; srv.sin_family=AF_INET; srv.sin_port=htons(6000); srv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
connect(sClient, (sockaddr*)&srv, sizeof(srv));
// 通信 send/recv
closesocket(sClient);
WSACleanup();

5. UDP 服務器/客戶端

UDP 無連接,服務器 bind 後直接 recvfrom,客戶端 sendto 指定目標地址。無需 listen/accept/connect。

6. 字節序轉換

網絡傳輸使用大端序,x86 主機為小端。端口、IP 地址整數形式必須用 htons/htonl 轉換,接收端用 ntohs/ntohl 轉回。

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