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

UDP 資料傳輸實作(二):接收迴圈、資源釋放與 Send/Receive 方法詳解

     編輯:關於C語言

非同步接收迴圈實作

在 WinForm 應用中,為避免 UI 凍結,通常另開一條執行緒持續監聽 UDP 封包:

private void listen()
{
    while (true)
    {
        string text = Encoding.UTF8.GetString(uc.Receive(ref IEp));
        lbInfo.Items.Add(text + "\n");
    }
}
  • uc.Receive(ref IEp):封鎖式呼叫,直到收到資料為止,IEp 會回填發送端的 IPEndPoint。
  • 資料以 UTF-8 解碼為字串後直接加入 ListBox 顯示。

清除介面與資源釋放

清空按鈕

lbInfo.Items.Clear();

覆寫 Dispose 釋放非受控資源

protected override void Dispose(bool disposing)
{
    if (disposing && (components != null))
    {
        components.Dispose();
        th.Abort();   // 強制結束接收執行緒
        uc.Close();   // 關閉 UdpClient
    }
    base.Dispose(disposing);
}

注意:Thread.Abort() 在 .NET Core/.NET 5+ 已過時,建議改用 CancellationToken 實作優雅停止。

UdpClient 核心方法詳細說明

Send 方法多載

public int Send(byte[] dgram, int bytes);
public int Send(byte[] dgram, int bytes, string hostname, int port);
public int Send(byte[] dgram, int bytes, IPEndPoint endPoint);
參數說明
dgram待發送的位元組陣列
bytes實際發送長度(通常為 dgram.Length)
hostname/port目標主機名或 IP 與連接埠
endPoint封裝好 IP 與 Port 的 IPEndPoint 物件

Receive 方法

public byte[] Receive(ref IPEndPoint remoteEP);
  • 無多載,單一簽章。
  • 回傳接收到的位元組陣列。
  • remoteEP 為 ref 參數,呼叫後會包含發送端資訊,方便回覆。

實測觀察:UDP 不可靠特性

實際測試中,資料偶爾無法送達對端,這正是 UDP「無連線、不保證送達」的本質。若應用層需要可靠性,須自行實作確認與重傳機制(如序號、ACK、超時重送)。

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