日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

7、linux网络编程--广播

發(fā)布時(shí)間:2025/7/25 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7、linux网络编程--广播 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? 同一個(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。