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

UDP 通訊輕鬆入門:結構體傳輸與 MFC 實作範例

     編輯:關於VC++

前言

在模擬與控制系統中,常需多機器間高頻率交換數據。UDP(User Datagram Protocol)無連線、低延遲、支援多點傳輸的特性,使其成為此類場景的首選。本文透過一個完整的「發送端 / 接收端」 MFC 範例,示範如何用 CSocket 以結構體形式傳輸控制參數。

UDP vs TCP 快速對比

特性UDPTCP
連線模式無連線面向連線
可靠性不保證送達/順序可靠、有序、無錯誤
多點傳輸支援一對多、多對一僅一對一
適用場景即時控制、視訊串流、廣播檔案傳輸、Web、郵件

範例架構

建立兩個對話框專案:

  • Send 專案:按鈕 IDC_BUTTON_SEND 觸發發送
  • Receive 專案:按鈕 IDC_BUTTON_RECEIVE 觸發接收並彈窗顯示

雙方約定相同的資料結構 _PLATFORM:

struct _PLATFORM {
    int err_num;  // 故障代碼
    int sj;       // 參數1
    int hy;       // 參數2
    int zy;       // 參數3
};

發送端核心程式碼

void CSendDlg::OnButtonSend() {
    _PLATFORM Platform = {0, 200, 300, 100}; // 初始化數據
    CSocket sock;
    sock.Create(2330, SOCK_DGRAM);            // 建立 UDP socket,綁定本地埠 2330
    sock.SendTo(&Platform, sizeof(Platform), 3550, _T("127.0.0.1")); // 發送至本機 3550 埠
}

接收端核心程式碼

void CReceiveDlg::OnButtonReceive() {
    _PLATFORM Platform1;
    CSocket sock;
    sock.Create(3550, SOCK_DGRAM);            // 綁定接收埠 3550

    char buffer[256];
    sock.Receive(buffer, 256);                // 阻塞等待數據

    _PLATFORM* p = (_PLATFORM*)buffer;        // 直接轉型,零拷貝
    CString str;
    str.Format(_T("err_num=%d, sj=%d, hy=%d, zy=%d"),
               p->err_num, p->sj, p->hy, p->zy);
    AfxMessageBox(str);
}

關鍵點解析

  1. 埠號對應:發送端 SendTo(..., 3550, ...) 對應接收端 Create(3550, ...)
  2. 結構體記憶體佈局一致:雙方結構體定義必須完全相同(含對齊),否則解析錯誤
  3. 零拷貝轉型:(_PLATFORM*)buffer 直接將接收緩衝區解讀為結構體,效率極高
  4. 啟動順序:必須先啟動接收端進入 Receive 等待,再觸發發送端

進階建議

  • 生產環境建議加入序列化/反序列化層,處理位元組序、結構體版本演進
  • 使用 CAsyncSocket 或 IOCP 實現非阻塞收發,避免 UI 凍結
  • 加入校驗和或封包序號,偵測丟包與亂序
  • 組播(Multicast)可實現一對多廣播,適合多節點同步場景

執行畫面

發送端介面 接收端介面

完整原始碼請參考本文配套下載。掌握此範例,即可快速構建基於 UDP 的輕量級控制/監控通訊模組。

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