


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、VC 實(shí)現(xiàn)局域網(wǎng)組播IP 層的通信技術(shù)。為了幫助讀者理解,下面將簡要的介紹一下多播的概念。眾所周知,普通IP通信的功能,而且可以有效減輕網(wǎng)絡(luò)通信的負(fù)擔(dān),避免資源的無謂浪費(fèi)。LAN機(jī)器都必須對該消息進(jìn)行處理。多播通信則不同,數(shù)據(jù)從一個(gè)工作站發(fā)出后,如果在其它LAN本實(shí)例由Sender 和Receiver 兩個(gè)程序組成,Sender 用戶從控制臺上輸入多播發(fā)送數(shù)據(jù), Receiver 端都要求加入同一個(gè)多播組,完成接收Sender 發(fā)送的多播數(shù)據(jù)。一、實(shí)現(xiàn)方法1、協(xié)議支持Win32WinSockTCP/IP 協(xié)議之上的, 所以本文只針對IP支持多播通信的平臺包括WindowsCE2.1Window
2、s95Windows98WindowsNT4Windows 2000WindowsXP2.1WindowsCE 才開始實(shí)現(xiàn)對IPWindowsXP2、多播地址IP 采用DD2825DI PD 類I P244.0.0.0239.255.255.255 根本沒有使用(也不能使用(主機(jī)),而244.0.0.2網(wǎng)內(nèi)的所有路由器。在RFC 1700 A N A)負(fù)責(zé)著這個(gè)列表的維護(hù)。在表11地 址 說 明244.0.0.1 基本地址(保留)244.0.0.1 子網(wǎng)上的所有系統(tǒng)244.0.0.2子網(wǎng)上的所有路由器244.0.0.5子網(wǎng)上所有OSPF 路由器244.0.0.6子網(wǎng)上所有指定的OSPF 路由器
3、244.0.0.9RIP2244.0.1.1網(wǎng)絡(luò)時(shí)間協(xié)議244.0.1.24 WINS3、多播路由器D group management ICMP。它只有兩種分組: 第二字段是一個(gè)DRFC1112多播路由器的選擇是通過生成樹實(shí)現(xiàn)的4、庫支持WinSockAPIIPWinSock。第一種方法是WinSock1 提供的, 要求通過套接字選項(xiàng)來加入一個(gè)組;另一種方法是 WinSock2專門負(fù)責(zé)多播組的加入,這個(gè)函數(shù)便是WSAJoinLeaf,它是基層協(xié)議是無關(guān)的。本文將通過 一個(gè)多播通信的實(shí)例的實(shí)現(xiàn)過程,來講敘多播實(shí)現(xiàn)的主要步驟。因?yàn)閃indow98 以后版本都安裝了Winsock2.0WinSoc
4、k2.0二、編程步驟1、啟動(dòng) Visual C+6.0,創(chuàng)建一個(gè)控制臺項(xiàng)目工程 MultiCase。在此項(xiàng)目工程中添加 Sender和 Receiver 兩個(gè)項(xiàng)目。Receiver 項(xiàng)目實(shí)現(xiàn)步驟:創(chuàng)建一個(gè)SOCK_DGRAMSocket。將此Socket(3)加入多播組。WinSock2 中引入一個(gè)WSAJoinLeaf,此函數(shù)原型如下:SOCKET WSAJoinLeaf( SOCKET s, const struct sockaddr FAR *name, int namelen, LPWSABUF lpCallerData, LPWSABUF lpCalleeData, LPQOS lp
5、SQOS, LPQOS lpGQOS, DWORD dwFlags );sWSASocketWSAJoinLeaf 就會失敗,并返回錯(cuò)誤WSAEINVAL。第二個(gè)參數(shù)是 套接字地址IP名字長度)是用于指定name 參數(shù)的長度,以字節(jié)為單位。第四個(gè)參數(shù)呼叫者數(shù)據(jù))的作用是在會話建立之后,將一個(gè)數(shù)據(jù)緩沖區(qū)傳輸給自己通信的對方。第五個(gè)參數(shù)被叫者數(shù)據(jù))用于初始化一個(gè)緩沖區(qū),在會話建好之后,接收來自對方的數(shù)據(jù)。注意在當(dāng)前的WindowslpCalleeData現(xiàn),所以均應(yīng)設(shè)為NULLLpSQOSlpGQOS 這兩個(gè)參數(shù)是有關(guān)服務(wù)質(zhì)量)的設(shè)置,通常也設(shè)為NULL,有關(guān)Qos 內(nèi)容請參閱MSDN 或有關(guān)書籍
6、。最后一個(gè)參數(shù)dwFlags 指出該主機(jī)是發(fā)送數(shù)據(jù)、接收數(shù)據(jù)或收發(fā)兼并。該參數(shù)可選值分別是:JL_SENDER_ONLY、JL_RECEIVER_ONLY 或者 JL_BOTH。在 WinSock1 平臺上加入多播組需要調(diào)用setsockopt 函數(shù),同時(shí)設(shè)置 IP_ADD_MEMBERSHIP選項(xiàng),指定想加入的那個(gè)組的地址結(jié)構(gòu)。具體實(shí)現(xiàn)代碼將在下面代碼注釋列出。(4)接收多播數(shù)據(jù)。Sender 實(shí)現(xiàn)步驟:(1)創(chuàng)建一個(gè)SOCK_DGRAM 類型的Socket。(2)加入多播組。(3)發(fā)送多播數(shù)據(jù)。3、編譯兩個(gè)項(xiàng)目,在局域網(wǎng)中按如下步驟測試: (1)將Sender.exe 拷貝到發(fā)送多播數(shù)據(jù)的
7、pc 上。(2)將Receiver.exe 拷貝到多個(gè)要求接收多播數(shù)據(jù)的pc 上。(3)各自運(yùn)行相應(yīng)的程序。(4)在Sender PCReceiver PC三、程序代碼Receiver.c 程序代碼: #include #include #include #include #define MCASTADDR 233.0.0.1 #define MCASTPORT 5150 綁定的本地端口號。#define BUFSIZE 1024 int main( int argc,char * argv)WSADATA wsd;struct sockaddr_in local,remote,from; S
8、OCKET sock,sockM;TCHAR recvbufBUFSIZE;/*struct ip_mreq mcast; / Winsock1.0 */ int len = sizeof( struct sockaddr_in); int ret;/初始化WinSock2.2if( WSAStartup( MAKEWORD(2,2),&wsd) != 0 )printf(WSAStartup() failedn); return -1;/*創(chuàng)建一個(gè)SOCK_DGRAM 類型的SOCKET,WSA_FLAG_MULTIPOINT_C_LEAFIP 表示IP數(shù)據(jù)面層有關(guān)概念請參閱MSDN*/ i
9、f(sock=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF| WSA_FLAG_OVERLAPPED) = INVALID_SOCKET)printf(socket failed with:%dn,WSAGetLastError(); WSACleanup();return -1;/將 sock 綁定到本機(jī)某端口上。local.sin_family = AF_INET; local.sin_port = htons(MCASTPORT); local.sin
10、_addr.s_addr = INADDR_ANY;if( bind(sock,(struct sockaddr*)&local,sizeof(local) = SOCKET_ERROR )printf( bind failed with:%d n,WSAGetLastError(); closesocket(sock);WSACleanup(); return -1;/加入多播組remote.sin_family = AF_INET;remote.sin_port = htons(MCASTPORT); remote.sin_addr.s_addr = inet_addr( MCASTADD
11、R );/* Winsock1.0 */*mcast.imr_multiaddr.s_addr = inet_addr(MCASTADDR); mcast.imr_interface.s_addr = INADDR_ANY;if( setsockopt(sockM,IPPROTO_IP,IP_ADD_MEMBERSHIP, (char*)&mcast,sizeof(mcast) = SOCKET_ERROR)printf(setsockopt(IP_ADD_MEMBERSHIP) failed:%dn,WSAGetLastError(); closesocket(sockM);WSAClean
12、up(); return -1;*/* Winsock2.0*/if( sockM = WSAJoinLeaf(sock,(SOCKADDR*)&remote,sizeof(remote), NULL,NULL,NULL,NULL,JL_BOTH) = INVALID_SOCKET)printf(WSAJoinLeaf() failed:%dn,WSAGetLastError(); closesocket(sock);WSACleanup(); return -1;/QUITwhile(1)if( ret = recvfrom(sock,recvbuf,BUFSIZE,0, (struct s
13、ockaddr*)&from,&len) = SOCKET_ERROR)printf(recvfrom failed with:%dn,WSAGetLastError(); closesocket(sockM);closesocket(sock); WSACleanup(); return -1;if( strcmp(recvbuf,QUIT) = 0 ) break; else recvbufret = 0;printf(RECV: %s FROM n,recvbuf,inet_ntoa(from.sin_addr);closesocket(sockM); closesocket(sock)
14、; WSACleanup(); return 0;Sender.c 程序代碼#include #include #include #include #define MCASTADDR 233.0.0.1 #define MCASTPORT 5150 本地端口號。#define BUFSIZE 1024 int main( int argc,char * argv)WSADATA wsd;struct sockaddr_in remote; SOCKET sock,sockM;TCHAR sendbufBUFSIZE;int len = sizeof( struct sockaddr_in);/
15、初始化WinSock2.2if( WSAStartup( MAKEWORD(2,2),&wsd) != 0 )printf(WSAStartup() failedn); return -1; if(sock=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF| WSA_FLAG_OVERLAPPED) = INVALID_SOCKET)printf(socket failed with:%dn,WSAGetLastError(); WSACleanup();ret
16、urn -1;/加入多播組remote.sin_family = AF_INET;remote.sin_port = htons(MCASTPORT); remote.sin_addr.s_addr = inet_addr( MCASTADDR ); if( sockM = WSAJoinLeaf(sock,(SOCKADDR*)&remote,sizeof(remote),NULL,NULL,NULL,NULL, JL_BOTH) = INVALID_SOCKET)printf(WSAJoinLeaf() failed:%dn,WSAGetLastError(); closesocket(sock);WSACleanup(); return -1;/QUITwhile(1)printf(SEND : ); scanf(%s,sendbuf);if( sendto(sockM,(char*)sendbuf,strlen(sendbuf),0, (struct sockaddr*)&remote,sizeof(remote)=SOCKET_ERROR)printf(sendto failed
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 服裝店裝修發(fā)包合同
- 2025年度養(yǎng)豬場生物安全防控體系建設(shè)合同
- 2025年度勞動(dòng)合同到期解除協(xié)議書及離職員工離職證明及離職手續(xù)辦理指南
- 2025年度建筑勞務(wù)施工節(jié)能減排合作協(xié)議
- 2025年度分紅股收益分配與權(quán)益變更協(xié)議
- 2025年度數(shù)據(jù)保密審計(jì)與保密合同
- 2025年度公司免責(zé)的旅游服務(wù)合作協(xié)議
- 2025年度創(chuàng)業(yè)公司股權(quán)激勵(lì)及轉(zhuǎn)讓協(xié)議
- 2025年網(wǎng)絡(luò)游戲行業(yè)發(fā)展現(xiàn)狀分析:網(wǎng)絡(luò)游戲國內(nèi)用戶規(guī)模不斷擴(kuò)大
- 崗位晉升申請書
- 2024年成人高等教育學(xué)士學(xué)位英語水平考試大綱
- 職業(yè)技術(shù)學(xué)院《酒店財(cái)務(wù)管理》課程標(biāo)準(zhǔn)
- 【蘇教版信息科技】三年級下冊8.1《認(rèn)識自主可控》教案
- MIL-STD-202-211-2020美國美軍標(biāo)準(zhǔn)
- 《假性動(dòng)脈瘤》課件
- JBT 14682-2024 多關(guān)節(jié)機(jī)器人用伺服電動(dòng)機(jī)技術(shù)規(guī)范(正式版)
- 診所校驗(yàn)現(xiàn)場審核表
- DL-T 572-2021電力變壓器運(yùn)行規(guī)程-PDF解密
- 教科版四下科學(xué)《植物的生長變化》單元解讀(新教材解讀)
- 2024年高考生物考前信息必刷卷02(全國卷新教材)(含答案與解析)
- JB-T 14509-2023 反滲透海水淡化設(shè)備技術(shù)規(guī)范
評論
0/150
提交評論