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

UDP 協定實現區域網路廣播通訊範例

     編輯:關於C語言

UDP (User Datagram Protocol) 為無連線、不可靠傳輸協定,特性在於資料面向整個網路廣播,區域網內所有主機均可接收相同資料。

UDP 特性總覽

接收端實作 (綁定本地埠 + 監聽廣播)

// 初始化 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 或平台原生非同步網路庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性說明
無連線發送前無需建立連線 (無三次交握)
不可靠不保證送達、不保證順序、不重傳
廣播支援單次發送可達網段內所有主機
低延遲無連線建立/狀態維護開銷