《Linux網路程式設計》: UDP廣播程式設計
阿新 • • 發佈:2019-01-04
1. 關於廣播請參考
2. UDP廣播介紹
廣播只能用 UDP 或原始IP實現,不能用 TCP。
UDP 廣播特點如下:
- 處於同一子網的所有主機都必須處理資料。
- UDP 資料包會沿協議棧向上一直到 UDP 層,因為到 UDP 層,埠不匹配的話,資料才會丟棄,如下圖,所以,執行音視訊等較高速率工作的應用,會帶來較大的負擔。
3. 廣播示例使用
預設的情況下,不允許傳送廣播資料包
,需要修改套介面選項:int setsockopt( int sockfd, int level, int optname,const void *optval,socklen_t optlen);
功能:設定套接字選項
引數:
sockfd:套接字
其它引數說明如下:
注意:optval的值應該這樣填,定義一個賦值為 1 的整型變數,int opt=1, 然後把這個變數的地址放這個位置,如:&opt
返回值:
成功執行返回0,否則返回-1
使用例子如下:
//設定該套接字為廣播型別 int opt=1; setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));
下面我們寫一個 UDP 廣播發送資料包例子,目的埠指定為 8000,目的 IP 為受限廣播地址:255.255.255.255,那樣,同一個區域網的所有主機網絡卡都會收到這個資料,但是,只有埠為 8000 的網路應用程式才會收到這個資料包:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { unsigned short port = 8000; // 埠 char *server_ip = "255.255.255.255"; // 受限廣播地址 int sockfd; sockfd = socket(AF_INET, SOCK_DGRAM, 0); //建立UDP套接字 if(sockfd < 0) { perror("socket"); exit(-1); } struct sockaddr_in dest_addr; bzero(&dest_addr, sizeof(dest_addr)); dest_addr.sin_family = AF_INET; dest_addr.sin_port = htons(port); inet_pton(AF_INET, server_ip, &dest_addr.sin_addr); printf("send data to UDP server %s:%d!\n", server_ip, port); //設定該套接字為廣播型別,這個很重要 int opt=1; setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt)); char send_buf[512] = "this is a broadcast data"; sendto(sockfd, send_buf, strlen(send_buf), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr));//傳送資料 close(sockfd); return 0; }
編譯執行如下: