| 特性 | 說明 |
| 無連線 | 發送前無需建立連線 (無三次交握) |
| 不可靠 | 不保證送達、不保證順序、不重傳 |
| 廣播支援 | 單次發送可達網段內所有主機 |
| 低延遲 | 無連線建立/狀態維護開銷 |
接收端實作 (綁定本地埠 + 監聽廣播)
// 初始化 Winsock 2.2
WSADATA wsData; WSAStartup(MAKEWORD(2,2), &wsData);
// 本地綁定位址 (任意介面、指定埠)
SOCKADDR_IN localAddr;
localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = INADDR_ANY; // 0.0.0.0
localAddr.sin_port = htons(5050);
// 廣播來源位址 (用於 recvfrom)
SOCKADDR_IN fromAddr;
fromAddr.sin_family = AF_INET;
fromAddr.sin_addr.s_addr = INADDR_BROADCAST; // 255.255.255.255
fromAddr.sin_port = htons(5050);
int fromLen = sizeof(SOCKADDR_IN);
// 建立 UDP Socket
SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
// 關鍵:啟用廣播屬性
BOOL optVal = TRUE;
setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&optVal, sizeof(optVal));
// 綁定本地埠
bind(s, (SOCKADDR*)&localAddr, sizeof(localAddr));
// 接收迴圈
char buf[256];
while (true) {
recvfrom(s, buf, 256, 0, (SOCKADDR*)&fromAddr, &fromLen);
printf("收到廣播: %s\n", buf);
Sleep(2000);
ZeroMemory(buf, 256);
}
發送端實作 (目標設為廣播位址)
SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
BOOL optVal = TRUE;
setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&optVal, sizeof(optVal));
SOCKADDR_IN broadcastAddr;
broadcastAddr.sin_family = AF_INET;
broadcastAddr.sin_addr.s_addr = INADDR_BROADCAST; // 或特定網段廣播如 192.168.1.255
broadcastAddr.sin_port = htons(5050);
char* msg = "Hello LAN!";
sendto(s, msg, strlen(msg), 0, (SOCKADDR*)&broadcastAddr, sizeof(broadcastAddr));
關鍵點總結
- SO_BROADCAST 選項雙向必開:發送端才能送往廣播位址,接收端才能從廣播位址收到資料。
- 無 listen/accept,直接 recvfrom/sendto。
- 綁定位址 (bind) 僅指定本地接收埠,不等同 發送目標位址。
- 廣播位址 INADDR_BROADCAST (255.255.255.255) 為有限廣播,僅限本網段;亦可使用直接廣播 (如 192.168.1.255) 跨子網 (需路由器支援)。
測試環境
Visual C++ 6.0 / Windows 2000 驗證通過。現代開發建議使用 Boost.Asio、libuv 或平台原生非同步網路庫。
- 上一篇文章: DOS 圖形模式下中文顯示技術:HZK16/HZK24 字庫直接繪製
- 下一篇文章: AppBuilder/VC 直接呼叫 ODBC API 存取資料庫完整指南
Copyright ©
程式碼之家 All Rights Reserved