首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

WinSocket UDP 通訊僅首次傳送成功的原因與可靠性對比

     編輯:程式設計綜合問答

現象描述

本機兩個 UDP 程式(發送端/接收端),第一次發送正常接收,第二次發送接收端收不到資料。

根本原因

UDP 是無連線、不可靠協議:

  • 無握手、無序列號、無確認重傳。
  • 封包在網路層(IP)傳輸過程中可能因擁塞、校驗錯誤、緩衝區溢位而丟失。
  • 本機回環(127.0.0.1)雖可靠度高,但仍屬 UDP 行為,應用層不處理重傳即視為丟包。

程式碼潛在問題

  1. 接收端緩衝區大小:recvfrom(sServer, szBuf, strlen(szBuf), ...) 第三參數應為緩衝區長度 sizeof(szBuf),而非 strlen(szBuf)(未初始化陣列長度為 0)。
  2. 發送端未檢查回傳值:sendto 回傳實際發送位元組數,應驗證是否等於預期長度。
  3. 無應用層確認機制:需自行實作 ACK/重傳/序列號才能保證可靠交付。

UDP vs TCP 可靠性對比

特性UDPTCP
連線建立無三向交握
序列號/確認無有
超時重傳無(應用層自行實作)內建
流量/擁塞控制無有
適用場景即時影音、廣播、遊戲狀態同步檔案傳輸、HTTP、資料庫連線

建議

  • 若專案需可靠傳輸,直接改用 SOCK_STREAM (TCP) 或在 UDP 上層實作可靠協議(如 KCP、QUIC)。
  • 教學/測試階段可接受 UDP 偶發丟包,但生產環境嚴禁無確認機制的 UDP 傳輸關鍵資料。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved