7、linux网络编程--广播
? ? 同一個子網的所有主機網卡都會接受所在網段廣播地址的數據包。廣播地址應用于局域網內的所有主機。
廣播地址是專門用于同時向網絡中所有工作站發送的一個地址。
????廣播地址主要分為兩類:
(1)受限廣播:路由器從來不會轉發受限的廣播數據包,但同一個子網的所有主機都會接受到受限廣播的數據包。
????ip地址的網絡字段和主機字段權為1就是受限廣播地址:255.255.255.255
(2)直接廣播:發送到目標網絡的所有主機,如ip地址為192.168.2.1的主機也可以發送廣播到192.168.1.0這個網絡。
廣播特點
對于一個帶網卡設備的主機,它能接收到哪些網絡數據包呢?
1)網卡會接收目的 ip 和它的 ip 地址相同的數據包(至于能不能到應用層我們暫時不管,至于MAC地址如何確定我們暫時也不管),這個就是單播傳輸數據。
2)網卡會接收到目的 ip 為廣播地址數據包,這個廣播地址的 MAC 地址為:ff:ff:ff:ff:ff:ff 。
3)如果這個主機加入了多播組,它也會接收該多播組地址的數據包,詳情請看《多播》。
?
廣播只能用 UDP 或原始IP實現,不能用 TCP。
?
UDP 廣播特點如下:
?
-
處于同一子網的所有主機都必須處理數據。
-
UDP?數據包會沿協議棧向上一直到 UDP 層,因為到 UDP 層,端口不匹配的話,數據才會丟棄,如下圖,所以,運行音視頻等較高速率工作的應用,會帶來較大的負擔。
廣播示例使用
默認的情況下,不允許發送廣播數據包,需要修改套接口選項:
int setsockopt( int sockfd,?
int level,??
int optname,
const void *optval, ??
socklen_t optlen);
功能:
設置套接字選項
參數:
sockfd:套接字
其它參數說明如下:
?
注意:optval的值應該這樣填,定義一個賦值為 1 的整型變量,int opt=1, 然后把這個變量的地址放這個位置,如:&opt
?
返回值:
成功執行返回0,否則返回-1
?
使用例子如下:
?
[objc]?view plaincopy
?
//設置該套接字為廣播類型??
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,?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;??
} ?
?
轉載于:https://www.cnblogs.com/yjds/p/8597430.html
總結
以上是生活随笔為你收集整理的7、linux网络编程--广播的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4、linux网络编程--套接字的介绍
- 下一篇: bzoj 4488: [Jsoi2015