當(dāng)前位置首頁(yè) > 計(jì)算機(jī) > 編程與開發(fā)語(yǔ)言
搜柄,搜必應(yīng)! 快速導(dǎo)航 | 使用教程

第10章 廣播與多播編程 (2)

文檔格式:PPT| 20 頁(yè)|大小 166.01KB|積分 16|2024-12-12 發(fā)布|文檔ID:253388139
第1頁(yè)
第2頁(yè)
第3頁(yè)
下載文檔到電腦,查找使用更方便 還剩頁(yè)未讀,繼續(xù)閱讀>>
1 / 20
此文檔下載收益歸作者所有 下載文檔
  • 版權(quán)提示
  • 文本預(yù)覽
  • 常見問題
  • 單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,第10章,廣播與多播編程,廣播,一個(gè),IP,地址由網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)組成所有主機(jī)號(hào)部分為全,1,的,IP,地址是廣播地址發(fā)送應(yīng)用進(jìn)程,UDP,IPv4,數(shù)據(jù)鏈路,UDP,IPv4,數(shù)據(jù)鏈路,數(shù)據(jù)鏈路,IPv4,UDP,接收應(yīng)用進(jìn)程,以太網(wǎng),頭部,IPv4,頭部,UDP,頭部,UDP,數(shù)據(jù),子網(wǎng)128.7.6,目的以太網(wǎng),=,ff:ff:ff:ff:ff:ff,幀類型,=0800,目的,IP=128.7.6.255,協(xié)議,=UDP,目的端口,=520,Sendto,目的,IP=128.7.6.255,目的端口,=520,丟棄,協(xié)議,=UDP,幀類型,0800,128.7.6.99=,單播,128.7.6.255=,廣播,128.7.6.5=,單播,128.7.6.255=,廣播,協(xié)議,=UDP,端口,=520,廣播的實(shí)現(xiàn),應(yīng)用程序只能通過,UDP,方式發(fā)送廣播一般情況下,如果調(diào)用,sendto,,只能向非廣播地址發(fā)送數(shù)據(jù)報(bào)如果要發(fā)送廣播數(shù)據(jù)報(bào),必須告訴內(nèi)核,可以通過設(shè)置,SO_BROADCAST,套接口選項(xiàng)來(lái)做到這一點(diǎn)。

    int,on=1;,setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(int,);,廣播實(shí)例,服務(wù)端為,tserv.c,,運(yùn)行時(shí)需指定廣播地址和端口號(hào),運(yùn)行后每,3,秒發(fā)送一次廣播,將本機(jī)時(shí)間通知本子網(wǎng)內(nèi)所有主機(jī)服務(wù)器端程序,tserv.c,#include,#include,#include,#include,#define BUFLEN 255,void,getcurtime(char,*,curtime,),time_t,tm;,time(&tm,);,snprintf(curtime,BUFLEN,%sn,ctime(&tm,);,int,main(int,argc,char,*,argv,),struct,sockaddr_in,peeraddr,;,int,sockfd,on,=1;,int,num,i,;,char msgBUFLEN+1;,if(argc,!=3),printf(usage:%s,n,argv0);,exit(0);,sockfd,=socket(AF_INET,SOCK_DGRAM,0);,if(sockfd,0),fprintf(stderr,socket,creating error in,,);,exit(1);,setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(int,);,memset(&peeraddr,0,sizeof(struct,sockaddr_in,);,peeraddr.sin_family,=AF_INET;,if(inet_pton(AF_INET,argv1,&peeraddr.sin_addr)=0),printf(Wrong,dest,IP addressn);,exit(0);,peeraddr.sin_port,=htons(atoi(argv2);,for(;),getcurtime(msg,);,int,a;,a=sendto(sockfd,msg,strlen(msg),0,(struct,sockaddr,*)&,peeraddr,sizeof(struct,sockaddr_in,);,printf(%d,a,);,fflush(stdout,);,sleep(3);,客戶端程序,tcli.c,(,只需偵聽某一固定端口的數(shù)據(jù)報(bào),接收一個(gè)數(shù)據(jù)報(bào)就返回。

    ),#include,#include,#include,#include,#define BUFLEN 255,int,main(int,argc,char,*,argv,),struct,sockaddr_in,localaddr,;,int,sockfd,n,;,char msgBUFLEN+1;,if(argc,!=2),printf(usage:%s,n,argv0);,exit(0);,sockfd,=socket(AF_INET,SOCK_DGRAM,0);,if(sockfd,0),fprintf(stderr,socket,creating error in,,);,exit(1);,memset(&localaddr,0,sizeof(struct,sockaddr_in,);,localaddr.sin_port,=htons(atoi(argv1);,localaddr.sin_addr.s_addr,=,htonl(INADDR_ANY,);,int,opt=SO_REUSEADDR;,setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt,);,if(bind(sockfd,(struct,sockaddr,*)&,localaddr,sizeof(struct,sockaddr_in,)0),fprintf(stderr,bind,error in,,);,exit(2);,n=,read(sockfd,msg,BUFLEN,);,if(n,=-1),fprintf(stderr,read,error in,,);,exit(3);,else,msgn,=0;,printf(%s,msg,);,程序運(yùn)行結(jié)果,如果在服務(wù)器端輸入,./,serv,222.18.113.171 1234,則兩個(gè)客戶不會(huì)同時(shí)收到數(shù)據(jù)報(bào)。

    多播,多播是,通過,D,類地址進(jìn)行的,,D,類地址的前,4,位為,1110,,后面,28,位為群播的組標(biāo)識(shí)地址范圍,224.0.0.0,到,239.255.255.255,特殊的,IPv4,多播地址:,224.0.0.0,保留,224.0.0.1,本子網(wǎng)上所有主機(jī),224.0.0.2,本子網(wǎng)上所有網(wǎng)關(guān),224.0.1.1 NTP(,網(wǎng)絡(luò)時(shí)間協(xié)議,),組,多播的,原理,當(dāng)一個(gè)多播分組到達(dá)一個(gè)以太網(wǎng)時(shí),形成幀后它的,MAC,地址為,01:00:5e:xx:xx:xx,,其后,23,位由多播組標(biāo)識(shí)的后,23,位映射而成例如目的地址為,224.0.1.1,的多播分組,在以太網(wǎng)上幀的,MAC,地址就為,01:00:5e:00:01:01,,如下圖示11100000,00000000,00000001,00000001,00000001,00000000,01011110,00000000,00000001,00000001,IP,地址,MAC,地址,由于多播,IP,地址中組標(biāo)識(shí)有,28,位,而映射到,MAC,地址的只有,23,位,還差,5,位,所以有,32,個(gè)組將映射成相同的,MAC,地址,例如,224.0.0.1,,,225.0.1.1,239.128.1.1,都映射到,MAC,地址,01:00:5e:00:01:01,。

    因此要由,IP,層來(lái)檢驗(yàn)到達(dá)的多播分組是否是自已所加入的多播組如果不是,則拋棄該分組應(yīng)用程序,UDP,IP,層,132.0.0.100,數(shù)據(jù)鏈路層,52:37:4a:6d:7f:5e,應(yīng)用程序,UDP,IP,層,132.0.0.129,應(yīng)用程序,UDP,IP,層,132.0.0.168,數(shù)據(jù)鏈路層,52:23:4e:6f:2c:35,數(shù)據(jù)鏈路層,00:2e:2c:5f:ae:3f,發(fā)送數(shù)據(jù)報(bào),IP:224.0.1.1,端口,1234,通過,ARP,解析,224.0.1.1,對(duì)應(yīng),01:00:5e:00:01:01,接收數(shù)據(jù)報(bào),端口,1234,應(yīng)用程序指定,132.0.0.129,加入多播組,224.0.1.1,IP,層指示接收,MAC,地址為,01:00:5e:00:01:01,的幀,加入,225.0.1.1,丟棄,多播數(shù)據(jù)報(bào)在子網(wǎng)中的發(fā)送接收,多播,的,實(shí)現(xiàn),應(yīng)用程序只需向多播組地址發(fā)送數(shù)據(jù)報(bào),接收應(yīng)用程序加入這個(gè)多播組在指定端口上進(jìn)行偵聽加入多播組的方法是設(shè)置套接口選項(xiàng),IP_ADD_MEMBERSHIP.,它要用要如下結(jié)構(gòu):,Struct,ip_mreq,struct,in_addr,imr_multiaddr,;/*IPv4,的,D,類多播地址*,/,Struct,in_addr,imr_interface,;/*,本地接口,IPv4,地址*,/,;,例:,setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mcaddr,sizeof(struct,ip_mreq,),多播的實(shí)現(xiàn),服務(wù)器端程序沒有什么改變,只要將設(shè)置,socket,選項(xiàng),SO_BROADCAST,的那行去掉就可以了。

    客戶程序源碼如下頁(yè):,源程序,mtcli.c,#include,#include,#include,#include,#define BUFLEN 255,int,main(int,argc,char,*,argv,),struct,sockaddr_in,localaddr,;,int,sockfd,n,;,struct,ip_mreq,mcaddr,;,char msgBUFLEN+1;,if(argc,3),printf(usage:%s,n,argv0);,exit(0);,sockfd,=socket(AF_INET,SOCK_DGRAM,0);,if(sockfd,0),fprintf(stderr,socket,creating error in,,);,exit(1);,memset(&localaddr,0,sizeof(struct,sockaddr_in,);,localaddr.sin_port,=htons(atoi(argv2);,localaddr.sin_addr.s_addr,=,htonl(INADDR_ANY,);,if(inet_pton(AF_INET,222.18.113.171,&,mcaddr.imr_interface,)=0),perror(failure,);,exit(0);,if(inet_pton(AF_INET,argv1,&,mcaddr.imr_multiaddr,)=0),printf(Wrong,multicast IP addressn);,exit(0);,printf(ip:%s,inet_ntoa(mcaddr.imr_multiaddr,);,fflush(stdout,);,if(,setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mcaddr,sizeof(struct,ip_mreq,),0),perror(setsockopt,error in,mtcli.c,join,multicast failedn);,exit(4);,if(bind(sockfd,(struct,sockaddr,*)&,localaddr,sizeof(struct,sockaddr_in,)0),fprintf(stderr,bind,error in,,);,exit(2);,n=,read(sockfd,msg,BUFLEN,);,if(n,=-1),fprintf(stderr,read,error in,,);,exit(3);,else,msgn,=0;,printf(%s,msg,);,程序運(yùn)行結(jié)果,向多播組,224.0.4.5,發(fā)送數(shù)據(jù)報(bào),加入,224.0.4.5,并在,1234,端口偵聽,思考:客戶收到數(shù)據(jù)報(bào)的源地址是多少?,。

    點(diǎn)擊閱讀更多內(nèi)容
    最新文檔
    傳統(tǒng)文化道德不是高懸的明月而是腳下的星光.pptx
    世界無(wú)煙日關(guān)注青少年成長(zhǎng)健康無(wú)煙為成長(zhǎng)護(hù)航.pptx
    五四青年節(jié)詩(shī)詞贊歌五四青年自強(qiáng)不息.pptx
    XX學(xué)校班主任培訓(xùn)用心管理慧做班主任.pptx
    拒絕熬夜健康養(yǎng)生規(guī)律作息遠(yuǎn)離亞健康.pptx
    兒童成長(zhǎng)手冊(cè)時(shí)光里的童真印記.pptx
    幼兒園夏季傳染病預(yù)防指南預(yù)見夏天健康童行夏季傳染病預(yù)防科普.pptx
    高中生心理健康教育主題班會(huì)快樂學(xué)習(xí)高效學(xué)習(xí)正視壓力學(xué)會(huì)減壓.pptx
    員工職業(yè)道德與職業(yè)素養(yǎng)培訓(xùn)遵守職業(yè)道德提高職業(yè)修養(yǎng).pptx
    2025職業(yè)病防治法宣傳周健康守護(hù)職防同行.pptx
    XX幼兒園防災(zāi)減災(zāi)安全教育臨災(zāi)不亂安全童行學(xué)會(huì)保護(hù)自己.pptx
    在2025年縣教育工作大會(huì)暨高考備考工作推進(jìn)會(huì)上的講話發(fā)言材料.docx
    在2025年縣全面從嚴(yán)治黨和黨風(fēng)廉政會(huì)議上的講話發(fā)言材料.docx
    在2025年全市慶?!拔逡弧濒邉趧?dòng)模范表彰大會(huì)上的講話發(fā)言材料多篇.docx
    2025年稅務(wù)局青年代表在五四青年座談會(huì)上的發(fā)言材料3篇.docx
    在2025年市委全體會(huì)議上的主持講話發(fā)言材料.docx
    2025年黨風(fēng)廉政建設(shè)工作要點(diǎn)材料.docx
    在2025年全市青年干部慶祝五四青年節(jié)大會(huì)上的講話發(fā)言材料多篇.docx
    在入黨積極分子培訓(xùn)班上的講話發(fā)言材料.docx
    縣文旅局黨組書記在五一假期及夏季旅游安全生產(chǎn)工作部署會(huì)議上的講話發(fā)言材料.docx
    賣家[上傳人]:hsw3625
    資質(zhì):實(shí)名認(rèn)證