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