版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、安徽省巢湖學(xué)院計(jì)算機(jī)與信息工程學(xué)院課程設(shè)計(jì)報(bào)告課程名稱: Windows網(wǎng)絡(luò)編程 課題名稱: 基于套接字的網(wǎng)絡(luò)廣播程序設(shè)計(jì)與實(shí)現(xiàn) 專業(yè)班級(jí): 11網(wǎng)絡(luò)工程 同組姓名: 白壯麗、劉國(guó)文、王鳳娟、王艷楠 同組學(xué)號(hào): 12035002、12035022、12035039、12035043 聯(lián)系方式:白 壯 麗:137 3199 9702 指導(dǎo)教師:吳 其 林 17目 錄一、實(shí)驗(yàn)?zāi)康?二、 實(shí)驗(yàn)內(nèi)容與小組分工12.1開發(fā)背景;1 2.2功能要求;12.3、相關(guān)協(xié)議及原理;22.4、小組成員分工;2三、設(shè)計(jì)思路與步驟33.1、設(shè)備與環(huán)境;33.2、廣播信息的發(fā)送端;33.3、廣播信息的接收端;4四、 程
2、序代碼44.1、頭文件;44.2、發(fā)送端;54.3、接收端;6五、設(shè)計(jì)過(guò)程及詳細(xì)程序分析75.1設(shè)計(jì)過(guò)程;75.2詳細(xì)程序設(shè)計(jì)分析;7(1)、發(fā)送端程序設(shè)計(jì)分析:7(2)、接收端程序設(shè)計(jì)分析:10六、調(diào)試分析126.1正常發(fā)送和接受;126.2、發(fā)送端本地取消地址綁定:136.3、接收端未進(jìn)行端口綁定;146.4、發(fā)送端未指定廣播端口;156.5、修改程序保存調(diào)試時(shí),未關(guān)閉原先所進(jìn)行調(diào)試的窗口;16七、 總結(jié)17一、實(shí)驗(yàn)?zāi)康?用我們所學(xué)過(guò)的知識(shí),以達(dá)到鞏固所學(xué)知識(shí),提高我們思考問(wèn)題、分析問(wèn)題和解決問(wèn)題能力的目的。學(xué)會(huì)基于VC6.0 的程序開發(fā)的環(huán)境搭建與配置,并在實(shí)際運(yùn)用中學(xué)習(xí)和掌握
3、VC程序開發(fā)的全過(guò)程。進(jìn)一步熟悉掌握VC+程序設(shè)計(jì)語(yǔ)言的基礎(chǔ)內(nèi)容,如局域網(wǎng)絡(luò)中的數(shù)據(jù)通信、基于Socket程序的設(shè)計(jì)等 進(jìn)一步掌握TCP和UDP方式的網(wǎng)絡(luò)編程模式。能運(yùn)用Winsock提供的API函數(shù)接口進(jìn)行網(wǎng)絡(luò)編程的編寫,理解廣播程序的工作原理,利用數(shù)據(jù)報(bào)式套接字編寫一個(gè)廣播發(fā)送與接收程序,在局域網(wǎng)中實(shí)現(xiàn)廣播。 通過(guò)親自動(dòng)手寫程序,一方面拓展知識(shí)面,一方面鍛煉調(diào)試能力。二、 實(shí)驗(yàn)內(nèi)容與小組分工2.1開發(fā)背景; 廣播系統(tǒng)具有實(shí)用性、經(jīng)濟(jì)性、便捷性等特點(diǎn),廣泛應(yīng)用于各種公共場(chǎng)合,如進(jìn)行全校的公共廣播、課間操、召開全校大會(huì)等。利用傳統(tǒng)廣播的概念,將其與網(wǎng)絡(luò)連接起來(lái),即可實(shí)現(xiàn)網(wǎng)絡(luò)資源共享,典型的例子
4、如:網(wǎng)絡(luò)教學(xué)。在網(wǎng)絡(luò)越來(lái)越發(fā)達(dá)的今天,人們對(duì)網(wǎng)絡(luò)的依賴越來(lái)越多,越來(lái)越離不開網(wǎng)絡(luò), 基于VC6.0的局域網(wǎng)廣播系統(tǒng)能更方便的在局域網(wǎng)中傳遞信息,因此產(chǎn)生了制作一個(gè)局域網(wǎng)的廣播系統(tǒng);而且通過(guò)制作該程序還能更好的學(xué)習(xí)網(wǎng)絡(luò)軟件編程知識(shí).2.2功能要求; 利用數(shù)據(jù)報(bào)套接字建立一個(gè)廣播發(fā)送與接收系統(tǒng),該系統(tǒng)由兩方程序組成:廣播的發(fā)送端與廣播的接收端,廣播的發(fā)送端每隔1秒鐘向網(wǎng)絡(luò)中發(fā)送一條廣播信息“This is Broadcast Test,而廣播接收端循環(huán)接收來(lái)自發(fā)送端發(fā)來(lái)的消息并將其輸出。2.3、相關(guān)協(xié)議及原理;用戶數(shù)據(jù)報(bào)協(xié)議(UDP)是 OSI 參考模型中一種無(wú)連接的傳輸層協(xié)議,提供面向事務(wù)的簡(jiǎn)單
5、不可靠信息傳送服務(wù)。是一個(gè)簡(jiǎn)單的面向數(shù)據(jù)報(bào)的傳輸層協(xié)議,IETF RFC 768是UDP的正式規(guī)范。 UDP 協(xié)議基本上是 IP 協(xié)議與上層協(xié)議的接口。 UDP 協(xié)議適用端口分別運(yùn)行在同一臺(tái)設(shè)備上的多個(gè)應(yīng)用程序。 由于大多數(shù)網(wǎng)絡(luò)應(yīng)用程序都在同一臺(tái)機(jī)器上運(yùn)行,計(jì)算機(jī)上必須能夠確保目的地機(jī)器上的軟件程序能從源地址機(jī)器處獲得數(shù)據(jù)包,以及源計(jì)算機(jī)能收到正確的回復(fù)。這是通過(guò)使用 UDP 的“端口號(hào)”完成的。例如,如果一個(gè)工作站希望在工作站 128.1.123.1 上使用域名服務(wù)系統(tǒng),它就會(huì)給數(shù)據(jù)包一個(gè)目的地址 128.1.123.1 ,并在 UDP 頭插入目標(biāo)端口號(hào) 53 。源端口號(hào)標(biāo)識(shí)了請(qǐng)求域名服務(wù)的
6、本地機(jī)的應(yīng)用程序,同時(shí)需要將所有由目的站生成的響應(yīng)包都指定到源主機(jī)的這個(gè)端口上。 2.4、小組成員分工;基于套接字的網(wǎng)絡(luò)廣播程序設(shè)計(jì)與實(shí)現(xiàn)學(xué) 號(hào)姓 名主 要 任 務(wù)12035002白壯麗詳細(xì)程序設(shè)計(jì)分析、調(diào)試分析、總結(jié)12035039王鳳娟設(shè)計(jì)思路與步驟12035022劉國(guó)文實(shí)驗(yàn)?zāi)康?2035043王艷楠實(shí)驗(yàn)內(nèi)容與小組分工小組負(fù)責(zé)人:白壯麗 聯(lián)系電話、設(shè)計(jì)思路與步驟3.1、設(shè)備與環(huán)境;(1)連接到互聯(lián)網(wǎng)上的PC機(jī)兩臺(tái)。(2)計(jì)算機(jī)硬件要求:Intel Pentium5 處理器、256MB以上內(nèi)存、Ethernet網(wǎng)卡、網(wǎng)絡(luò)若干。(3)計(jì)算機(jī)軟件要求:MS window
7、s 9x/2000/xp操作系統(tǒng),TCP/IP協(xié)議,Visual c+6.0/net系統(tǒng)。3.2、廣播信息的發(fā)送端;(1)創(chuàng)建一個(gè)數(shù)據(jù)報(bào)套接字用于發(fā)送廣播信息SOCKET s = socket(AF_INET,SOCK_DGRAM,0);(2)設(shè)置廣播選項(xiàng),是SO_BROADCAST選項(xiàng)有效BOOL bBroadcast = ture;Setsockopt(sBroadCast,SOL_BROADCAST,(char*)&bBroadCast,sizeof(BOOL);(3)設(shè)置廣播地址及廣播端口號(hào),這時(shí)的接收地址應(yīng)該設(shè)為地址INADDR_BROADCASTSOCKETADDR_IN
8、bcast;Bcast.sin_addr.s_addr=INADDR_BROADCAST;/:inet_addr(“255.255.255.255”);(4)發(fā)送廣播,調(diào)用sendto函數(shù)發(fā)送廣播,可如下程序所示:Cout sz = “This is just a test.rn”;While (TURE) sendto(s,sz,strlen(sz),0,(sockaddr*)&bcast,sizeof(bcast);Sleep(5000); (5)關(guān)閉套接字Closesocket(s);3.3、廣播信息的接收端;(1)創(chuàng)建一個(gè)數(shù)據(jù)報(bào)套接字用于接收廣播信息(2)綁定一個(gè)本地地址,指明
9、廣播端口號(hào)(要和發(fā)送方設(shè)置端口號(hào)的相同)作為接收端口。(3)接收廣播,調(diào)用recvform函數(shù)接收廣播:Cout<< “開始接收廣播數(shù)據(jù)nn”;SOCKADDR_IN addrRemote;Int nLen = sizeof(addrRemote);Char sz256;While(TURE) int nRet = : : recvform(s,sz,256,0,(sockaddr*)&addrRemote,&nLen);if(nRet > 0) sznRet = 0;Cout<<sz; (4)程序結(jié)束前,關(guān)閉套接字Closesocket(s);4
10、、 程序代碼4.1、頭文件;#ifndef _INITSOCK#define _INITSOCK#include"iostream.h"#include"conio.h"#include"winsock2.h"#pragma comment(lib,"ws2_32.lib")class CInitSockpublic:CInitSock() WSAData wsaData; if(WSAStartup(0x0202,&wsaData)!=0) cout<<"Winsock 系統(tǒng)初始化失
11、敗!n" exit(1); cout<<"Winsock 系統(tǒng)初始化成功!n" CInitSock() WSACleanup(); ;#endif4.2、發(fā)送端;#include "InitSock.h"#define PORT 2000#include<stdio.h>CInitSock initsock;void main()SOCKET s = socket(AF_INET,SOCK_DGRAM,0);if(s = INVALID_SOCKET)printf("Create Socket Failed!n
12、");return;printf("Create Socket Ok!n");BOOL bBroadcast = 1;setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char*)&bBroadcast,sizeof(BOOL);SOCKADDR_IN bcast;bcast.sin_family = AF_INET;bcast.sin_port = htons(0);bcast.sin_addr.S_un.S_addr = htonl(INADDR_ANY);bind(s,(sockaddr*)&bcast,sizeof
13、(bcast);SOCKADDR_IN broadcast;broadcast.sin_family = AF_INET;broadcast.sin_port = htons(PORT);broadcast.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST);printf("Begin to send broadcast!n");char sz = "This is just a test.rn"while(1) sendto(s,sz,strlen(sz),0,(sockaddr*)&broadcast
14、,sizeof(broadcast);Sleep(5000);printf("發(fā)送端發(fā)送""%sn",sz)closesocket(s);getch();4.3、接收端;#include "InitSock.h"#define PORT 2000CInitSock initsock;#include<stdio.h>void main()int ret;SOCKET s = socket(AF_INET,SOCK_DGRAM,0);if(s = INVALID_SOCKET)printf("Create Sock
15、et Failed!n");return;printf("Create Socket Ok!n");sockaddr_in Recvaddr;Recvaddr.sin_family = AF_INET;Recvaddr.sin_port = htons(PORT);Recvaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);bind(s,(sockaddr*)&Recvaddr,sizeof(Recvaddr);printf("Begin to receive broadcast!n");SOCK
16、ADDR_IN addrRemote;int nlen=sizeof(addrRemote);char sz256;while(true)ret=recvfrom(s,sz,256,0,(sockaddr*)&addrRemote,&nlen);if(ret>0)szret='0'printf("接收端接收""%sn",sz);closesocket(s);printf("Press any key to exit: ");getch();五、設(shè)計(jì)過(guò)程及詳細(xì)程序分析5.1設(shè)計(jì)過(guò)程; 廣播是指在一個(gè)
17、局域網(wǎng)中向所有的網(wǎng)上節(jié)點(diǎn)發(fā)送信息。這是udp連接的一種。 廣播有一個(gè)廣播組,即只有一個(gè)廣播組內(nèi)的節(jié)點(diǎn)才能收到發(fā)往這個(gè)廣播組的信息。什么決定了一個(gè)廣播組呢,就是端口號(hào),局域網(wǎng)內(nèi)一個(gè)節(jié)點(diǎn),如果設(shè)置了廣播屬性并監(jiān)聽(tīng)了端口號(hào)A后,那么他就加入了A組廣播,這個(gè)局域網(wǎng)內(nèi)所有發(fā)往廣播端口A的信息他都收的到。在廣播的實(shí)現(xiàn)中,如果一個(gè)節(jié)點(diǎn)想接受A組廣播信息,那么就要先將他綁定給地址和端口A,然后設(shè)置這個(gè)socket的屬性為廣播屬性。如果一個(gè)節(jié)點(diǎn)不想接受廣播信息,而只想發(fā)送廣播信息,那么不用綁定端口,只需要先為socket設(shè)置廣播屬性后,向廣播地址INADDR_BROADCAST的A端口發(fā)送udp信息即可。 數(shù)據(jù)
18、包套接字(SOCK_DGRAM):數(shù)據(jù)包套接字提供了一種無(wú)連接的服務(wù)。該服務(wù)并不能保證數(shù)據(jù)傳輸?shù)目煽啃?,?shù)據(jù)有可能在傳輸過(guò)程中丟失或出現(xiàn)數(shù)據(jù)重復(fù),且無(wú)法保證順序地接收到數(shù)據(jù)。數(shù)據(jù)包套接字使用UDP(User Datagram Protocol)協(xié)議進(jìn)行數(shù)據(jù)的傳輸。由于數(shù)據(jù)包套接字不能保證數(shù)據(jù)傳輸?shù)目煽啃?,?duì)于有可能出現(xiàn)的數(shù)據(jù)丟失情況,需要在程序中做相應(yīng)的處理。整個(gè)程序的設(shè)計(jì)模塊中主要分為兩個(gè)方面,一方面是接受端:主要是接受來(lái)發(fā)送端發(fā)送過(guò)來(lái)的消息,另一端是發(fā)送端:主要是定時(shí)向網(wǎng)絡(luò)中發(fā)送一條廣播消息。5.2詳細(xì)程序設(shè)計(jì)分析;(1)、發(fā)送端程序設(shè)計(jì)分析:a、首先是在發(fā)送端設(shè)置一個(gè)端口,用于發(fā)送消息。
19、我們?cè)谶@具體定義為2000端口:#define PORT 2000對(duì)Winsock系統(tǒng)進(jìn)行初始化,并判斷、輸出是否成功。SOCKET s = socket(AF_INET,SOCK_DGRAM,0);if(s = INVALID_SOCKET)printf("Create Socket Failed!n");return;printf("Create Socket Ok!n");b、我們可以用使用setsocket函數(shù)設(shè)置套接字選項(xiàng),設(shè)置廣播選項(xiàng)的具體級(jí)別與選項(xiàng)名稱分別為:SOL_SOCKET、SO_BROADCAST。例如可以如下設(shè)置一個(gè)套接字sBro
20、adCast的廣播選項(xiàng)。BOOL bBroadcast = ture;Setsockopt(sBroadCast,SOL_BROADCAST,(char*)&bBroadCast,sizeof(BOOL);c、對(duì)于setsockopt()函數(shù)解析:函數(shù)功能:設(shè)置套接字的選項(xiàng)以設(shè)定套接字的功能。函數(shù)原型:Int setsockopt ( SOCKET s, int level, int optname const char * optval, int optlen);參數(shù)說(shuō)明: s:標(biāo)識(shí)一個(gè)套接口的描述字。 level:選項(xiàng)定義的
21、層次;目前僅支持SOL_SOCKET和IPPROTO_TCP層次。 optname:需設(shè)置的選項(xiàng)。 optval:指針,指向存放選項(xiàng)值的緩沖區(qū)。 optlen:optval緩沖區(qū)的長(zhǎng)度。返回值:成功是返回0,失敗時(shí)返回SOCKET_ERROR。d、定義發(fā)送端地址:如果應(yīng)用程序不關(guān)心給它的本地地址,則可以將地址設(shè)為ADDR_ANY,這就允許底層服務(wù)提供者使用任何適當(dāng)?shù)木W(wǎng)絡(luò)地址。對(duì)于TCP/IP而言,端口可以指定為0,此事服務(wù)提供者會(huì)為程序分配10245000之間的唯一端口。SOCKADDR_IN bcast;bcast.si
22、n_family = AF_INET;bcast.sin_port = htons(0);bcast.sin_addr.S_un.S_addr = htonl(INADDR_ANY);e、綁定函數(shù),bind()函數(shù)功能:講套接字與本地地址綁定(注意是本地地址)函數(shù)原型:int bind(SOCKET s, const struct sockaddr* name, int namelen);參數(shù)說(shuō)明:s:一個(gè)帶綁定套接字句柄; name:待賦予套接字的本地地址: namelen:套接字地址變量占用的空間字節(jié)數(shù)。返回值:成功是返回0,失敗時(shí)返回-1(SOCKET_ERROR)。f、設(shè)置發(fā)送方的廣播
23、端口;并打印“Begin to send broadcast!”SOCKADDR_IN broadcast;broadcast.sin_family = AF_INET;broadcast.sin_port = htons(PORT);broadcast.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST);printf("Begin to send broadcast!n");g、設(shè)置發(fā)送池內(nèi)容,并定期發(fā)送;Sendto()函數(shù);函數(shù)功能:發(fā)送一個(gè)數(shù)據(jù)報(bào)到指定端口 函數(shù)原型:sendto( SOCKET s, char * buf,
24、 int len, int flags,struct sockaddr* to, int tolen); 參數(shù)說(shuō)明: s:一個(gè)標(biāo)識(shí)套接口的描述字。 buf:包含待發(fā)送數(shù)據(jù)的緩沖區(qū)。 len:buf緩沖區(qū)中數(shù)據(jù)的長(zhǎng)度。 flags:調(diào)用方式標(biāo)志位。 to:(可選)指針,指向目的套接口的地址。tolen:to所指地址的長(zhǎng)度。char sz = "This is just a test!n"while(1)sendto(s,sz,strlen(sz),0,(sockaddr*)&broadcast,sizeof(broadcast);Sleep(5000);Printf(
25、“發(fā)送端發(fā)送”%sn”,sz);h、關(guān)閉套接字S;closesocket(s);(2)、接收端程序設(shè)計(jì)分析:a、首先是在發(fā)送端設(shè)置一個(gè)端口并對(duì)Winsock系統(tǒng)進(jìn)行初始化;#define PORT 2000SOCKET s = socket(AF_INET,SOCK_DGRAM,0);if(s = INVALID_SOCKET)printf("Create Socket Failed!n"); return;printf("Create Socket Ok!n");b、設(shè)置接受方的廣播端口;并打印“Begin to receive broadcast!”
26、c、綁定函數(shù),bind();函數(shù)功能:講套接字與本地地址綁定(注意是本地地址)函數(shù)原型:int bind(SOCKET s, const struct sockaddr* name, int namelen);參數(shù)說(shuō)明:s:一個(gè)帶綁定套接字句柄; name:待賦予套接字的本地地址: namelen:套接字地址變量占用的空間字節(jié)數(shù)。返回值:成功是返回0,失敗時(shí)返回-1(SOCKET_ERROR)。sockaddr_in Recvaddr;Recvaddr.sin_family = AF_INET;Recvaddr.sin_port = htons(PORT);Recvaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);bind(s,(sockaddr*)&Recvaddr,sizeof(Recvaddr);printf("Begin to receive broadcast!n");e、判斷接收,當(dāng)接收到發(fā)送方發(fā)送的消息時(shí),打印出來(lái)接受內(nèi)容;while(true)ret=recvfrom(s,sz,256,0,(sockaddr*)&addrRemote,&nlen);if(ret>0)szret='0'pr
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版墊資贖樓業(yè)務(wù)風(fēng)險(xiǎn)控制合同2篇
- 2024電商技術(shù)服務(wù)合同3篇
- 2024年版市區(qū)高級(jí)公寓租賃合同版B版
- 2025年度玩具OEM貼牌加工安全標(biāo)準(zhǔn)合同3篇
- 2025年房屋貸款延期合同3篇
- 二零二五年度火鍋店餐飲服務(wù)承包合同范本2篇
- 二零二五年度跨境電商產(chǎn)業(yè)園房地產(chǎn)收購(gòu)合同3篇
- 2024版打膠合同書
- 二零二五年度智能機(jī)器人OEM委托研發(fā)與市場(chǎng)拓展合同
- 西南科技大學(xué)《西方音樂(lè)史(二)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年工程合作協(xié)議書
- 2025年山東省東營(yíng)市東營(yíng)區(qū)融媒體中心招聘全媒體采編播專業(yè)技術(shù)人員10人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年宜賓人才限公司招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 六年級(jí)下冊(cè)第四單元語(yǔ)文園地-語(yǔ)文園地四-學(xué)習(xí)任務(wù)單
- 《新聞采訪寫作》課程思政優(yōu)秀教學(xué)案例(一等獎(jiǎng))
- 竣工驗(yàn)收程序流程圖
- 清華經(jīng)管工商管理碩士研究生培養(yǎng)計(jì)劃
- 口腔科診斷證明書模板
- 管溝挖槽土方計(jì)算公式
- 國(guó)網(wǎng)浙江省電力公司住宅工程配電設(shè)計(jì)技術(shù)規(guī)定
- 煙花爆竹零售應(yīng)急預(yù)案
評(píng)論
0/150
提交評(píng)論