在網路程式設計中,UDP(User Datagram Protocol,用戶數據報協議)以其輕量、無連接的特性,成為即時通訊、串流媒體、遊戲同步等場景的首選。WinSock 作為 Windows 網路編程的標準 API,透過 CSocket 類(MFC 封裝)讓 UDP 通信變得異常簡單。本文將帶您從原理到代碼,完整掌握無連接通信的精髓。
與 TCP 的「客戶端-伺服器」模型不同,UDP 通信雙方地位完全對等:
SendTo 直接發送。ReceiveFrom 獲取數據,同時自動獲得發送方的地址資訊。但代價是:不保證送達、不保證順序、不保證不重複。適用於「寧丟包、不可延遲」的業務場景。
| 函數 | 用途 | 關鍵參數 |
|---|---|---|
Create | 建立本地 Socket | SOCK_DGRAM 指定資料報類型 |
Bind | 綁定本地 IP/埠 | 可選,若不綁定系統自動分配 |
SendTo | 發送數據到指定地址 | 目標 IP、埠號、資料緩衝區 |
ReceiveFrom | 接收數據並獲取來源 | 輸出參數返回發送方 IP/埠 |
// OnInitDialog 初始化
m_sockSend.Create(6800, SOCK_DGRAM, NULL); // 建立 UDP Socket,綁定本地埠 6800
m_sockSend.Bind(6800, "127.0.0.1"); // 顯式綁定(可省略)
SetTimer(1, 3000, NULL); // 每 3 秒發送一次
// OnTimer 定時發送
void CMy62_s1_clientDlg::OnTimer(UINT nIDEvent) {
static int iIndex = 0;
char szSend[20];
sprintf_s(szSend, "%010d", iIndex++); // 產生遞增序號
m_sockSend.SendTo(szSend, strlen(szSend), 6801, "127.0.0.1"); // 發往埠 6801
}
// OnInitDialog 初始化
m_sockRecv.Create(6801, SOCK_DGRAM, NULL); // 監聽埠 6801
// OnReceive 事件處理(需在訊息映射加入 ON_MESSAGE(WM_SOCKET_NOTIFY, OnSocketNotify))
void CMy62_s1_serverDlg::OnReceive(int nErrorCode) {
char szRecv[1024];
CString strSenderIP;
UINT uSenderPort;
int nLen = m_sockRecv.ReceiveFrom(szRecv, sizeof(szRecv), strSenderIP, uSenderPort);
if (nLen > 0) {
szRecv[nLen] = '\0';
// 處理接收到的數據,strSenderIP/uSenderPort 即發送方地址
}
CAsyncSocket::OnReceive(nErrorCode);
}
SendTo 目標 IP 填 255.255.255.255(廣播)或多播組地址(需 setsockopt 加入組),即可一對多通信。WinSock + MFC CSocket 讓 UDP 開發門檻極低,核心只需 Create → Bind → SendTo/ReceiveFrom 四步。掌握「無連接、不可靠、高效率」的特性,靈活應用於即時互動場景,將是您網路編程工具箱中的利器。