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

Socket 核心差異:TCP 與 UDP 完整對比與 Winsock 代碼示例

     編輯:Java 相關知識

核心區別速查表

特性TCP (SOCK_STREAM)UDP (SOCK_DGRAM)
連接模式面向連接(三次握手)無連接
可靠性保證數據正確、有序、無重複不保證,可能丟包、亂序、重複
數據邊界流模式(無邊界,需應用層分幀)數據報模式(保留邊界)
系統開銷較大(連接維護、確認重傳)較小
適用場景文件傳輸、郵件、Web、資料庫即時通訊、視訊流、DNS、SNMP、廣播
編程關鍵差異listen/accept、connect 確定地址無 listen/accept,sendto/recvfrom 每次攜帶地址

Winsock 代碼示例(C/C++)

1. TCP 服務端

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);
while (1) {
    SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
    send(sockConn, "Welcome...", ..., 0);
    recv(sockConn, recvBuf, 100, 0);
    closesocket(sockConn);
}

2. TCP 客戶端

SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv = {AF_INET, htons(6000), inet_addr("127.0.0.1")};
connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(addrSrv));
recv(sockClient, recvBuf, 100, 0);
send(sockClient, "This is client", ..., 0);
closesocket(sockClient);

3. UDP 服務端

SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(addrSrv));
recvfrom(sockSrv, recvBuf, 100, 0, (SOCKADDR*)&addrClient, &len);
// 無需 accept,直接從 addrClient 獲取發送方地址

4. UDP 客戶端

SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addrSrv = {AF_INET, htons(6000), inet_addr("127.0.0.1")};
sendto(sockClient, "Hello", ..., 0, (SOCKADDR*)&addrSrv, sizeof(addrSrv));
// 無需 connect,每次發送指定目標地址

關鍵 API 差異總結

  • socket():TCP 用 SOCK_STREAM,UDP 用 SOCK_DGRAM。
  • UDP 服務端不調用 listen() 和 accept()。
  • TCP:地址綁定於 connect()/accept() 返回的連接套接字。
    UDP:sendto()/recvfrom() 每次調用必須顯式傳遞 SOCKADDR_IN。
  • shutdown() 對 UDP 無效(無連接狀態)。

選型建議:何時使用 UDP?

滿足以下條件優先考慮 UDP:

  1. 數據多為短消息(< 512 bytes)。
  2. 客戶端數量極大(如物聯網設備),TCP 連接資源開銷不可接受。
  3. 業務可容忍偶爾丟包、亂序(或應用層自行實現可靠性)。
  4. 網絡負載極高,但要求極低延遲響應。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved