在模擬與控制系統中,常需多機器間高頻率交換數據。UDP(User Datagram Protocol)無連線、低延遲、支援多點傳輸的特性,使其成為此類場景的首選。本文透過一個完整的「發送端 / 接收端」 MFC 範例,示範如何用 CSocket 以結構體形式傳輸控制參數。
| 特性 | UDP | TCP |
|---|---|---|
| 連線模式 | 無連線 | 面向連線 |
| 可靠性 | 不保證送達/順序 | 可靠、有序、無錯誤 |
| 多點傳輸 | 支援一對多、多對一 | 僅一對一 |
| 適用場景 | 即時控制、視訊串流、廣播 | 檔案傳輸、Web、郵件 |
建立兩個對話框專案:
IDC_BUTTON_SEND 觸發發送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);
}
SendTo(..., 3550, ...) 對應接收端 Create(3550, ...)(_PLATFORM*)buffer 直接將接收緩衝區解讀為結構體,效率極高Receive 等待,再觸發發送端CAsyncSocket 或 IOCP 實現非阻塞收發,避免 UI 凍結

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