【Linux网络编程】广播
00. 目錄
文章目錄
- 00. 目錄
- 01. 廣播概述
- 02. 廣播地址分類
- 03. 廣播的特點
- 04. setsockopt函數
- 05. 程序示例
- 06. 附錄
01. 廣播概述
在生活中廣播無處不在,像平時在大街上賣物品的商人,在進行推廣產品的時候往往都是使用一個喇叭來進行吆喝:“十塊錢買不了吃虧,十塊錢買不了上當,走過路過千萬不要錯過”,這就是廣播。
那么在網絡中的廣播又是什么樣子的呢?
網絡上的廣播指:由一臺主機向該主機所在子網內(同一個局域網)的所有主機發送數據的方式。如下圖的 1 號主機廣播給 2、3、4、5 號主機發送數據:
實現廣播,離不開廣播地址,同一個子網(局域網)的所有主機網卡都會接收所在網段廣播地址的數據包。廣播地址應用于局域網內的所有主機。
廣播地址(Broadcast Address)是專門用于同時向網絡中(通常指同一子網)所有工作站進行發送的一個地址。
02. 廣播地址分類
1) 受限廣播
路由器從來不會轉發受限廣播的數據包,但同一個子網的所有主機都會接收到受限廣播的數據包。
IP 地址的網絡字段和主機字段全為 1 就是受限廣播地址255.255.255.255。
2) 直接廣播(也叫定向廣播)
直接廣播可以被路由轉發,發送到目標網絡的所有主機,如:ip地址為 192.168.2.1的主機也可以發送廣播到 192.168.1.0 這個網絡。當然不是所有的路由器,通常路由器是默認阻止直接廣播的(可以設置不阻止)。
IP 地址的網絡字段定義這個網絡,主機字段通常全為 1,如192.168.10.0/24 的直接廣播(定向廣播)地址為:192.168.10.255。
03. 廣播的特點
對于一個帶網卡設備的主機,它能接收到哪些網絡數據包呢?
1)網卡會接收目的 ip 和它的 ip 地址相同的數據包(至于能不能到應用層我們暫時不管,至于MAC地址如何確定我們暫時也不管),這個就是單播傳輸數據。
2)網卡會接收到目的 ip 為廣播地址數據包,這個廣播地址的 MAC 地址為:ff:ff:ff:ff:ff:ff 。
3)如果這個主機加入了多播組,它也會接收該多播組地址的數據包。
UDP 廣播特點如下:
- 處于同一子網的所有主機都必須處理數據。
- UDP 數據包會沿協議棧向上一直到 UDP 層,因為到 UDP 層,端口不匹配的話,數據才會丟棄,如下圖,所以,運行音視頻等較高速率工作的應用,會帶來較大的負擔。
04. setsockopt函數
默認的情況下,不允許發送廣播數據包,需要修改套接口選項:
int setsockopt( int sockfd, int level, int optname,const void *optval, socklen_t optlen); 功能:設置套接字選項參數:sockfd 套接字level SOL_SOCKEToptname SO_BROADCAST 允許發送廣播數據包SO_RCVBUF 接收緩沖區大小SO_SNDBUF 發送緩沖區大小optval 一般是int類型optlen optval所指向類型的字節大小返回值:成功執行返回0,否則返回-1注意:optval的值應該這樣填,定義一個賦值為 1 的整型變量,int opt=1, 然后把這個變量的地址放這個位置,如:&opt
應用示例
//設置該套接字為廣播類型 int opt=1; setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));05. 程序示例
源代碼
#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; }執行結果
溫馨提示
如果客戶端收不到數據 可能是Linux的防火墻沒有關閉導致,這時關閉防火墻即可。
06. 附錄
【Linux】一步一步學Linux網絡編程教程匯總: https://dengjin.blog.csdn.net/article/details/103026352
總結
以上是生活随笔為你收集整理的【Linux网络编程】广播的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C语言】枚举类型
- 下一篇: 【Linux网络编程】组播