




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章廣播與多播編程廣播一個(gè)IP地址由網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)組成。所有主機(jī)號(hào)部分為全1的IP地址是廣播地址。發(fā)送應(yīng)用進(jìn)程UDPIPv4數(shù)據(jù)鏈路UDPIPv4數(shù)據(jù)鏈路數(shù)據(jù)鏈路IPv4UDP接收應(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目的端口=520Sendto目的IP=128.7.6.255目的端口=520丟棄協(xié)議=UDP幀類型0800128.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)來做到這一點(diǎn)。inton=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<sys/socket.h>#include<arpa/inet.h>#include<sys/ioctl.h>#include<stdio.h>#defineBUFLEN255voidgetcurtime(char*curtime){time_ttm;time(&tm);snprintf(curtime,BUFLEN,"%s\n",ctime(&tm));}intmain(intargc,char**argv){structsockaddr_inpeeraddr;intsockfd,on=1;intnum,i;charmsg[BUFLEN+1];if(argc!=3){printf("usage:%s<ipaddress><port>\n",argv[0]);exit(0);}sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd<0){fprintf(stderr,"socketcreatingerrorintserv.c\n");exit(1);}setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(int));memset(&peeraddr,0,sizeof(structsockaddr_in));peeraddr.sin_family=AF_INET;if(inet_pton(AF_INET,argv[1],&peeraddr.sin_addr)<=0){printf("WrongdestIPaddress\n");exit(0);}peeraddr.sin_port=htons(atoi(argv[2]));for(;;){getcurtime(msg);inta;a=sendto(sockfd,msg,strlen(msg),0,(structsockaddr*)&peeraddr,sizeof(structsockaddr_in));printf("%d",a);fflush(stdout);sleep(3);}客戶端程序tcli.c(只需偵聽某一固定端口的數(shù)據(jù)報(bào),接收一個(gè)數(shù)據(jù)報(bào)就返回。)#include<sys/types.h>#include<sys/socket.h>#include<arpa/inet.h>#include<stdio.h>#defineBUFLEN255intmain(intargc,char**argv){structsockaddr_inlocaladdr;intsockfd,n;charmsg[BUFLEN+1];if(argc!=2){printf("usage:%s<port>\n",argv[0]);exit(0);}sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd<0){fprintf(stderr,"socketcreatingerrorintcli.c\n");exit(1);}memset(&localaddr,0,sizeof(structsockaddr_in));localaddr.sin_port=htons(atoi(argv[1]));localaddr.sin_addr.s_addr=htonl(INADDR_ANY);intopt=SO_REUSEADDR;setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));if(bind(sockfd,(structsockaddr*)&localaddr,sizeof(structsockaddr_in))<0){fprintf(stderr,"binderrorintcli.c\n");exit(2);}n=read(sockfd,msg,BUFLEN);if(n==-1){fprintf(stderr,"readerrorintcli.c\n");exit(3);}else{msg[n]=0;printf("%s",msg);}}程序運(yùn)行結(jié)果如果在服務(wù)器端輸入./serv222.18.113.1711234則兩個(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.1NTP(網(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,如下圖示。11100000000000000000000100000001000000010000000001011110000000000000000100000001IP地址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層來檢驗(yàn)到達(dá)的多播分組是否是自已所加入的多播組。如果不是,則拋棄該分組。應(yīng)用程序UDPIP層132.0.0.100數(shù)據(jù)鏈路層52:37:4a:6d:7f:5e應(yīng)用程序UDPIP層132.0.0.129應(yīng)用程序UDPIP層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.1IP層指示接收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):Structip_mreq{structin_addrimr_multiaddr;/*IPv4的D類多播地址*/Structin_addrimr_interface;/*本地接口IPv4地址*/};例:setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mcaddr,sizeof(structip_mreq))多播的實(shí)現(xiàn)服務(wù)器端程序沒有什么改變,只要將設(shè)置socket選項(xiàng)SO_BROADCAST的那行去掉就可以了??蛻舫绦蛟创a如下頁(yè):源程序mtcli.c#include<sys/types.h>#include<sys/socket.h>#include<arpa/inet.h>#include<stdio.h>#defineBUFLEN255intmain(intargc,char**argv){structsockaddr_inlocaladdr;intsockfd,n;structip_mreqmcaddr;charmsg[BUFLEN+1];if(argc<3){printf("usage:%s<multicast><port>\n",argv[0]);exit(0);}sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd<0){fprintf(stderr,"socketcreatingerrorintcli.c\n");exit(1);}memset(&localaddr,0,sizeof(structsockaddr_in));localaddr.sin_port=htons(atoi(argv[2]));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,argv[1],&mcaddr.imr_multiaddr)<=0){printf("WrongmulticastIPaddress\n");exit(0);}printf("ip:%s",inet_ntoa(mcaddr.imr_multiaddr));fflush(stdout);if(setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mcaddr,sizeof(structip_mreq))<0){perror("setsockopterrorinmtcli.c,joinmulticastfailed\n");exit(4);}if(bind(sockfd,(structsockaddr*)&localaddr,sizeof(structsockaddr_in))<0){
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版影視廣告制作與投放合同模板
- 二零二五年度電商企業(yè)快遞服務(wù)全面合作協(xié)議書范本
- 二零二五年度15kw大澤柴油發(fā)電機(jī)組購(gòu)銷與客戶定制化設(shè)計(jì)合同
- 2025版商鋪?zhàn)赓U合同樣本:解析與模板
- 二零二五版混凝土預(yù)制件購(gòu)銷及項(xiàng)目管理合同
- 2025版人工智能企業(yè)員工算法知識(shí)產(chǎn)權(quán)保密合同
- 2025版跨行業(yè)公司間資金借貸合同范本
- 二零二五年度汽車維修與保養(yǎng)服務(wù)合同
- 2025版智能家居系統(tǒng)集成與建筑工程二次結(jié)構(gòu)承包綜合服務(wù)合同
- 2025版工程擔(dān)保服務(wù)合同示范文本
- 奇瑞購(gòu)銷協(xié)議書范本
- 社區(qū)模擬試題和答案
- 國(guó)家衛(wèi)健委十八項(xiàng)制度醫(yī)療
- 2025年技師(二級(jí))養(yǎng)老護(hù)理員職業(yè)技能鑒定《理論知識(shí)》真題卷(后附答案和解析)
- 境外常駐人員管理辦法
- 2025年天貓國(guó)際母嬰分齡營(yíng)養(yǎng)白皮書-智篆文化
- 制酸基礎(chǔ)技能培訓(xùn)手冊(cè)
- 2025年初中語文名著閱讀《紅星照耀中國(guó)》每日一練含答案
- 室顫疑難病例討論
- 2025至2030中國(guó)城市地下管線探測(cè)行業(yè)發(fā)展?fàn)顩r與投資策略分析報(bào)告
- 大班健康冬天里的運(yùn)動(dòng)
評(píng)論
0/150
提交評(píng)論