| 特性 | TCP (SOCK_STREAM) | UDP (SOCK_DGRAM) |
|---|---|---|
| 連接類型 | 面向連接 | 無連接 |
| 傳輸單位 | 字節流 | 數據報 |
| 可靠性 | 可靠、有序 | 不可靠、無序 |
| 適用場景 | 文件傳輸、郵件、Web | 即時通訊、視頻流、DNS |
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") // 鏈接庫
socket(AF_INET, SOCK_STREAM, 0) 創建套接字bind 綁定 IP:PORT(INADDR_ANY 監聽所有網卡)listen 進入監聽狀態accept 阻塞等待客戶端,返回新套接字send/recv 雙向通信accept 處理多客戶端closesocket + WSACleanupsocket 創建connect 連接服務端 IP:PORTsend/recv 通信closesocket + WSACleanupSOCKADDR_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 → 點分十進制字符串#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();
}
listen/accept/connectsendto/recvfrom 攜帶目標/來源地址socket 類型為 SOCK_DGRAM

WSAStartup/WSACleanup 配對htons 導致綁定失敗send/recv 長度參數錯誤(含 \0 需 +1)