Linux网络编程 之 广播(五)
目錄
1. 廣播的定義
2. 廣播地址的分類
3. 廣播的特點
4. 廣播的使用
1. 廣播的定義
所謂的廣播,其實就是一臺主機向主機所在的所有子網內的所有主機發送數據的方式。
2. 廣播地址的分類
廣播地址是一種特殊的IP地址形式,一種是直接廣播地址,一種是有限廣播地址。
受限廣播就是255.255.255.255
受限廣播可以用在計算機不知道自己IP地址的時候,比如向DHCP服務器索要地址時、PPPOE撥號時等。
此地址可以在本網絡內廣播,路由器不允許通過它,所以“受限”。
直接廣播就是類似192.168.1.255/24這樣的地址
直接廣播可用于本地網絡,也可以跨網段廣播,比如主機192.168.1.1/30可以發送廣播包到192.168.1.7,使主機192.168.1.5/30也可以接收到該數據包,前提是之間的路由器要開啟定向廣播功能.
直接廣播地址是允許通過路由器的,當然不是所有的路由器,傻瓜式路由器是默認阻止直接廣播的。
3. 廣播的特點
首先廣播只能用UDP或原始IP實現,不能用TCP
而且,處于同一個子網的所有主機都必須處理數據。UDP數據包會沿著協議棧一直到UDP層,到了UDP層之后只有當端口不匹配時,數據才會丟棄。
4. 廣播的使用
默認的情況下,不允許發送廣播數據包,需要修改套接口選項:
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);- sockfd 套接字描述符
- level 套接字類型
- SOL_SOCKET 基本套接口
- IPPROTO_IP IPv4套接口
- IPPROTO_IPV6 IPv6套接口
- IPPROTO_TCP TCP套接口
optname 其實就是套接字類型對應的選項
如SOL_SOCKET有三個選項:
- SO_BROADCAST 允許發送廣播數據包
- SO_RCVBUF 接收緩存區大小
- SO_SNDBUF 發送緩存區大小
- optval 選項對應的值
- optlen 選項對應值的長度
如果成功返回0,否則返回-1
下面我們寫一個 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, charchar *argv[]) { unsigned short port = 8000; // 端口 charchar *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; } 超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的Linux网络编程 之 广播(五)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux网络编程 之 套接字(四)
- 下一篇: Linux网络编程 之 UDP编程(六)