




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第10章廣播與多播編程廣播一個IP地址由網絡號和主機號組成。所有主機號部分為全1的IP地址是廣播地址。發送應用進程UDPIPv4數據鏈路UDPIPv4數據鏈路數據鏈路IPv4UDP接收應用進程以太網頭部IPv4頭部UDP頭部UDP數據子網128.7.6目的以太網=ff:ff:ff:ff:ff:ff幀類型=0800目的IP=128.7.6.255協議=UDP目的端口=520Sendto目的IP=128.7.6.255目的端口=520丟棄協議=UDP幀類型0800128.7.6.99=單播128.7.6.255=廣播128.7.6.5=單播128.7.6.255=廣播協議=UDP端口=520廣播的實現應用程序只能通過UDP方式發送廣播。一般情況下,如果調用sendto,只能向非廣播地址發送數據報。如果要發送廣播數據報,必須告訴內核,可以通過設置SO_BROADCAST套接口選項來做到這一點。inton=1;setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(int));廣播實例服務端為tserv.c,運行時需指定廣播地址和端口號,運行后每3秒發送一次廣播,將本機時間通知本子網內所有主機。服務器端程序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(只需偵聽某一固定端口的數據報,接收一個數據報就返回。)#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);}}程序運行結果如果在服務器端輸入./serv222.18.113.1711234則兩個客戶不會同時收到數據報。多播多播是通過D類地址進行的,D類地址的前4位為1110,后面28位為群播的組標識。地址范圍224.0.0.0到239.255.255.255特殊的IPv4多播地址:224.0.0.0保留224.0.0.1本子網上所有主機224.0.0.2本子網上所有網關224.0.1.1NTP(網絡時間協議)組多播的原理當一個多播分組到達一個以太網時,形成幀后它的MAC地址為01:00:5e:xx:xx:xx,其后23位由多播組標識的后23位映射而成。例如目的地址為224.0.1.1的多播分組,在以太網上幀的MAC地址就為01:00:5e:00:01:01,如下圖示。11100000000000000000000100000001000000010000000001011110000000000000000100000001IP地址MAC地址由于多播IP地址中組標識有28位,而映射到MAC地址的只有23位,還差5位,所以有32個組將映射成相同的MAC地址,例如224.0.0.1,225.0.1.1,239.128.1.1都映射到MAC地址01:00:5e:00:01:01。因此要由IP層來檢驗到達的多播分組是否是自已所加入的多播組。如果不是,則拋棄該分組。應用程序UDPIP層132.0.0.100數據鏈路層52:37:4a:6d:7f:5e應用程序UDPIP層132.0.0.129應用程序UDPIP層132.0.0.168數據鏈路層52:23:4e:6f:2c:35數據鏈路層00:2e:2c:5f:ae:3f發送數據報IP:224.0.1.1端口1234通過ARP解析224.0.1.1對應01:00:5e:00:01:01接收數據報端口1234應用程序指定132.0.0.129加入多播組224.0.1.1IP層指示接收MAC地址為01:00:5e:00:01:01的幀加入225.0.1.1丟棄多播數據報在子網中的發送接收多播的實現
應用程序只需向多播組地址發送數據報,接收應用程序加入這個多播組。在指定端口上進行偵聽。加入多播組的方法是設置套接口選項IP_ADD_MEMBERSHIP.它要用要如下結構:Structip_mreq{structin_addrimr_multiaddr;/*IPv4的D類多播地址*/Structin_addrimr_interface;/*本地接口IPv4地址*/};例:setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mcaddr,sizeof(structip_mreq))多播的實現服務器端程序沒有什么改變,只要將設置socket選項SO_BROADCAST的那行去掉就可以了。客戶程序源碼如下頁:源程序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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江西省贛州市六校2024-2025學年高三質量監測(二)物理試題含解析
- 四川三河職業學院《材料應用設計實訓(1)》2023-2024學年第二學期期末試卷
- 遼寧省大連市第七十六中學2025年初三模擬考試(一)化學試題文試卷含解析
- 江蘇省蘇州市工業園區重點達標名校2024-2025學年中考第二次模擬考試化學試題理試題含解析
- 山東省威海市文登市2024-2025學年數學三下期末檢測試題含解析
- 內蒙古赤峰市2024-2025學年下學期高三化學試題第二次適應性測試試卷含解析
- 昆山登云科技職業學院《工筆人物創作與表現》2023-2024學年第一學期期末試卷
- 武漢生物工程學院《林業專業外語》2023-2024學年第二學期期末試卷
- 四川省南充市西充縣2025年四下數學期末綜合測試試題含解析
- 二零二五土地轉讓合同書范例
- 幼兒園防汛工作安全排查表
- 【超星爾雅學習通】機器的征途:空天科技網課章節答案
- 中國話劇史(本二·下)第二講課件
- GB/T 41908-2022人類糞便樣本采集與處理
- GB/T 5202-2008輻射防護儀器α、β和α/β(β能量大于60keV)污染測量儀與監測儀
- GB/T 4937.17-2018半導體器件機械和氣候試驗方法第17部分:中子輻照
- GB/T 3452.4-2020液壓氣動用O形橡膠密封圈第4部分:抗擠壓環(擋環)
- GB/T 28588-2012全球導航衛星系統連續運行基準站網技術規范
- GB/T 20523-2006企業物流成本構成與計算
- 發展心理學(重點回顧)
- 計劃生育協會基礎知識課件
評論
0/150
提交評論