Linux網(wǎng)絡(luò)編程——廣播

轉(zhuǎn)載 http://blog.csdn.net/tennysonsky/article/details/45563851#

概述
在生活中廣播無處不在异吻,像平時(shí)在大街上賣物品的商人喜庞,在進(jìn)行推廣產(chǎn)品的時(shí)候往往都是使用一個(gè)喇叭來進(jìn)行吆喝:“十塊錢買不了吃虧诀浪,十塊錢買不了上當(dāng)延都,走過路過千萬不要錯(cuò)過”,這就是廣播窄潭。

那么在網(wǎng)絡(luò)中的廣播又是什么樣子的呢酵颁?
網(wǎng)絡(luò)上的廣播指:由一臺主機(jī)向該主機(jī)所在子網(wǎng)內(nèi)(同一個(gè)局域網(wǎng))的所有主機(jī)發(fā)送數(shù)據(jù)的方式。如下圖的 1 號主機(jī)廣播給 2躏惋、3、4距误、5 號主機(jī)發(fā)送數(shù)據(jù):


實(shí)現(xiàn)廣播扁位,離不開廣播地址准潭,同一個(gè)子網(wǎng)(局域網(wǎng))的所有主機(jī)網(wǎng)卡都會(huì)接收所在網(wǎng)段廣播地址的數(shù)據(jù)包域仇。廣播地址應(yīng)用于局域網(wǎng)內(nèi)的所有主機(jī)。

廣播地址(Broadcast Address)是專門用于同時(shí)向網(wǎng)絡(luò)中(通常指同一子網(wǎng))所有工作站進(jìn)行發(fā)送的一個(gè)地址暇务。

廣播地址主要分為兩類
1)受限廣播
路由器從來不會(huì)轉(zhuǎn)發(fā)受限廣播的數(shù)據(jù)包怔软,但同一個(gè)子網(wǎng)的所有主機(jī)都會(huì)接收到受限廣播的數(shù)據(jù)包择镇。

IP 地址的網(wǎng)絡(luò)字段和主機(jī)字段全為 1 就是受限廣播地址255.255.255.255挡逼。

2)直接廣播(也叫定向廣播)
直接廣播可以被路由轉(zhuǎn)發(fā)腻豌,發(fā)送到目標(biāo)網(wǎng)絡(luò)的所有主機(jī),如:ip地址為 192.168.2.1的主機(jī)也可以發(fā)送廣播到 192.168.1.0 這個(gè)網(wǎng)絡(luò)饲梭。當(dāng)然不是所有的路由器,通常路由器是默認(rèn)阻止直接廣播的(可以設(shè)置不阻止)憔涉。

IP 地址的網(wǎng)絡(luò)字段定義這個(gè)網(wǎng)絡(luò),主機(jī)字段通常全為 1穿扳,如192.168.10.0/24 的直接廣播(定向廣播)地址為:192.168.10.255
廣播地址的更詳細(xì)介紹矛物,請看《廣播地址介紹》。

廣播特點(diǎn)
對于一個(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ù)包,詳情請看《多播》剥险。

廣播只能用 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

使用例子如下:

[cpp] view plain copy

//設(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, char *argv[])  
{  
    unsigned short port = 8000;             // 端口  
    char *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;  
}  

編譯運(yùn)行如下:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市修己,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睬愤,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砂豌,死亡現(xiàn)場離奇詭異,居然都是意外死亡阳距,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門筐摘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來映跟,“玉大人蓄拣,你說我怎么就攤上這事努隙。” “怎么了荸镊?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長躬存。 經(jīng)常有香客問我,道長岭洲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任盾剩,我火速辦了婚禮,結(jié)果婚禮上告私,老公的妹妹穿的比我還像新娘。我一直安慰自己驻粟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布挤巡。 她就那樣靜靜地躺著剩彬,像睡著了一般矿卑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粪摘,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機(jī)與錄音徘意,去河邊找鬼。 笑死椎咧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勤讽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼脚牍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了诸狭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤驯遇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后叉庐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玩郊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年匾竿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓦宜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岭妖。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖昵慌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斋攀,我是刑警寧澤已卷,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布淳蔼,位于F島的核電站,受9級特大地震影響鹉梨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜存皂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旦袋。 院中可真熱鬧,春花似錦疤孕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柬讨。三九已至,卻和暖如春踩官,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔗牡。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辩越,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓黔攒,卻偏偏與公主長得像强缘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子旅掂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容