基于UDP的服務(wù)器程序_第1頁
基于UDP的服務(wù)器程序_第2頁
基于UDP的服務(wù)器程序_第3頁
基于UDP的服務(wù)器程序_第4頁
基于UDP的服務(wù)器程序_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、精品與精品目 錄摘 要1 課程設(shè)計目的12 課程設(shè)計要求13相關(guān)知識14課程設(shè)計分析15程序代碼36運行結(jié)果與分析107參考文獻(xiàn)12精品與精品1 課程設(shè)計目的網(wǎng)絡(luò)服務(wù)是以客戶機/服務(wù)器模式工作的,服務(wù)器在特定的端口上提供網(wǎng)絡(luò)服務(wù)。本課程設(shè)計的主要目的的是通過編寫基于udp的服務(wù)器程序,了解客戶機/服務(wù)器與udp協(xié)議的工作原理。2 課程設(shè)計要求根據(jù)后面介紹的udp協(xié)議的工作原理,編寫程序?qū)崿F(xiàn)基于udp的服務(wù)器。1) 以命令行形式運行:udpserver serve_port其中,udpserver為程序名,server_port為服務(wù)器使用的端口號。2) 輸出內(nèi)容:服務(wù)器與客戶端的交互過程,例如

2、:udp server recceive:。udp server send:。3 相關(guān)知識udp協(xié)議是一種無連接的 不可靠的傳輸層協(xié)議。從應(yīng)用層的角度來看,udp協(xié)議在網(wǎng)絡(luò)層的ip協(xié)議的基礎(chǔ)上,向應(yīng)用層的程序提供不可靠的數(shù)據(jù)包傳輸服務(wù)。udp協(xié)議為上面的應(yīng)用層提供傳輸服務(wù)。udp協(xié)議主要用于對傳輸效率要求很高的應(yīng)用層協(xié)議,例如引導(dǎo)協(xié)議(bootp) 網(wǎng)絡(luò)時間協(xié)議(ntp) 簡單網(wǎng)絡(luò)管理協(xié)議(snmp) 簡單的文件傳輸協(xié)議(tftp)等。另外,域名服務(wù)器(dns) 同時依賴于tcp與udp協(xié)議。由于udp協(xié)議采用無連接的工作方式,并且只提供有限的差錯控制,因此udp協(xié)議簡單并且執(zhí)行效率很高。ud

3、p協(xié)議沒有采用基于窗口的流量控制機制,當(dāng)數(shù)據(jù)包過多時在接收端可能會出現(xiàn)溢出,接收端無法判斷在傳輸中出現(xiàn)那種錯誤,應(yīng)用層還需要提供一定的差錯控制功能。目前,一些實用要求一恒定速率發(fā)送數(shù)據(jù),并且在網(wǎng)絡(luò)出現(xiàn)擁塞時可以丟失一些數(shù)據(jù),但是不希望數(shù)據(jù)傳輸?shù)臅r延太大,udp協(xié)議正好可以適應(yīng)這種需求?;趗dp協(xié)議的網(wǎng)絡(luò)應(yīng)用也采用客戶機/服務(wù)器模式。在這里,客戶機與服務(wù)器表示互相通信的兩個應(yīng)用程序的進(jìn)程,它們分別被稱為udp客戶機與udp服務(wù)器。udp服務(wù)器是指提供某種網(wǎng)絡(luò)服務(wù)的應(yīng)用進(jìn)程,它通過熟知端口號來向客戶提供服務(wù)。3.2 tcp/ip協(xié)議技術(shù)在t c p / i p協(xié)議族中,有兩個互不相同的傳輸協(xié)議:

4、 t c p(傳輸控制協(xié)議)和u d p(用戶數(shù)據(jù)報協(xié)議)。t c p為兩臺主機提供高可靠性的數(shù)據(jù)通信。它所做的工作包括把應(yīng)用程序交給它的數(shù)據(jù)分成合適的小塊交給下面的網(wǎng)絡(luò)層,確認(rèn)接收到的分組,設(shè)置發(fā)送最后確認(rèn)分組的超時時鐘等。由于運輸層提供了高可靠性的端到端的通信,因此應(yīng)用層可以忽略所有這些細(xì)節(jié)。而另一方面, u d p則為應(yīng)用層提供一種非常簡單的服務(wù)。它只是把稱作數(shù)據(jù)報的分組從一臺主機發(fā)送到另一臺主機,但并不保證該數(shù)據(jù)報能到達(dá)另一端。任何必需的可靠性必須由應(yīng)用層來提供。3.3 tcp/ip協(xié)議與winsock網(wǎng)絡(luò)編程接口winsock規(guī)范不是一種網(wǎng)絡(luò)協(xié)議,而是一套開放的、支持多種協(xié)議的win

5、dows寫的網(wǎng)絡(luò)編程接口。winsock可以訪問很多種網(wǎng)絡(luò)協(xié)議,可以把它當(dāng)作一種協(xié)議的封裝?,F(xiàn)在的winsock已經(jīng)基本上實現(xiàn)了與協(xié)議無關(guān),可以使用winsock來調(diào)用協(xié)議的功能3.4winsock api的應(yīng)用主要涉及到的函數(shù):(1)wsastartup函數(shù),基本格式為intwsatartup(word wversionrequestted,lpwsadatalpwsadata);(2)wsacleanup函數(shù),其基本格式為intwsacleanup (void);(3)socket函數(shù),其格式為 socket(intaf,inttype,int protocol);用于創(chuàng)建一個能夠進(jìn)行網(wǎng)絡(luò)

6、通信的套接字。(4)closesocket函數(shù)格式為:intclosesocket(socket s);用來關(guān)閉一個描述符為s的套接字。(5)send 函數(shù)格式為:int send(socket s,const char far *buf,intlen ,int flags);向tcp連接的另一端發(fā)送數(shù)據(jù)。(6)recv函數(shù)格式為:intrecv(socket s, char far *buf,intlen, int flags);用來從tcp的另一端接收數(shù)據(jù)。(7)bind函數(shù)格式為:int bind(socket s, conststructsockaddr far *name,intna

7、melen);用來給socket 綁定一個ip地址和端口號。(8)listen函數(shù)格式為:int listen (socket s,int backlog);使流套接字s處于監(jiān)聽狀態(tài)。(9)accept函數(shù)格式為:socket accept (socket s, structsockaddr far *addr,int far *addrlen);該函數(shù)從監(jiān)聽狀態(tài)的的流套接字s的客戶連接請求隊列取出排在最前面的客戶請求,并且創(chuàng)建一個新的套接字來與客戶套接字創(chuàng)建連接通道。(10)connect函數(shù)格式為:int connect(socket s,conststructsockaddr far *

8、name,intnamelen);使用該函數(shù)使客戶socke與監(jiān)聽與計算機特定端口上的服務(wù)socket進(jìn)行連接,這臺計算機由name指定。4 課程設(shè)計分析首先編寫兩個程序分別為客戶器與服務(wù)器,使得兩者建立連接,在客戶器中發(fā)送命令然后等待服務(wù)器提供相應(yīng)的反映,具體實現(xiàn)如下:對于udp服務(wù)器端,服務(wù)程序首先調(diào)用套接口函數(shù)socket(),然后調(diào)用綁定ip地址和協(xié)議端口 號函數(shù)bind()。之后調(diào)用函數(shù)recvfrom()接收客戶數(shù)據(jù),調(diào)用sendto()向客戶發(fā)送數(shù)據(jù)。 對于udp客戶端,客戶機 程序啟動后調(diào)用套接口函數(shù)socket(),然后調(diào)用sendto()向服務(wù)器發(fā)送數(shù)據(jù),調(diào)用recvfro

9、m()接收服務(wù)器數(shù)據(jù)。 雙 方數(shù)據(jù)交換成功后,各自調(diào)用關(guān)閉套接口函數(shù)close()關(guān)閉套接口。udp套接口通信方式。具體流程圖如下:否irecv=recvfrom()調(diào)用失敗輸出調(diào)用失敗開始確定端口號輸出服務(wù)器wsastartupslisten=socketbind()是是是否否否否1isend=sendto()!=0調(diào)用成功closesocket(saccept)closesocket(saccept)結(jié)束=0!=0輸出接收到的數(shù)據(jù)、ip地址、端口號=0流程圖二:結(jié)束提示輸入地址否輸出調(diào)用失敗開始帶參main()定義變量wsastartupsocket()recvfrom()sendto()

10、是是是是是否否否否wsacleanup()closesocket()largc2接收數(shù)據(jù)初始化緩沖區(qū)程序二:客戶機端程序#include#include#include#define default_port 5050#define data_buffer 1024#pragma comment(lib,ws2_32.lib)void main(int argc,char* argv)wsadata wsadata;socket sclient; int iport=5050;int ilen;int isend,irecv;char send_buf=hello! i am a client

11、;char recv_bufdata_buffer;struct sockaddr_in ser;if(argc2) printf(輸入服務(wù)器的ip地址:n); return; elsememset(recv_buf,0,sizeof(recv_buf);if(wsastartup(makeword(2,2),&wsadata)!=0) printf(winsock環(huán)境初始化失?。簄); return; sclient=socket(af_inet,sock_dgram,0);if(sclient=invalid_socket) printf(socket()函數(shù)調(diào)用失敗:%dn,wsaget

12、lasterror(); return;ser.sin_family=af_inet; ser.sin_port=htons(iport);ser.sin_addr.s_addr=inet_addr(argv1); ilen=sizeof(ser); isend=sen結(jié)束提示輸入地址否輸出調(diào)用失敗開始帶參main()定義變量wsastartupsocket()recvfrom()sendto()是是是是是否否否否wsacleanup()closesocket()largc2接收數(shù)據(jù)初始化緩沖區(qū)5.程序代碼5 #include 6 #include 7 #pragma comment(lib,

13、 ws2_32) / 鏈接到?ws2_32.lib 8 bool initwinsock();9 void main()10 11 socket socket1;1213 initwinsock();14 struct sockaddr_in server;15 int len =sizeof(server);16 server.sin_family=af_inet;17 server.sin_port=htons(1000); /server的?監(jiān)聽y端?口18 server.sin_addr.s_addr=inet_addr(); /server的?地?址 1920 so

14、cket1=socket(af_inet,sock_dgram,ipproto_udp);21 while (1)22 char buffer1024=0;23 24 25 printf(udp needer please input messagen);26 scanf(%s,buffer);27 if (strcmp(buffer,bye)=0)28 break;29 if (sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&server,len)!=socket_error)30 printf(udp needer send

15、: %sn,buffer);31 if (recvfrom(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&server,&len)!=socket_error)32 printf(receive from udp:%sn,buffer);33 34 35 closesocket(socket1);36 3738 bool initwinsock()39 40 int error;41 word versionrequested;42 wsadata wsadata;43 versionrequested=makeword(2,2);44 e

16、rror=wsastartup(versionrequested,&wsadata); /啟?動winsock245 if(error!=0)46 47 return false;48 49 else50 51 if(lobyte(wsadata.wversion)!=2|hibyte(wsadata.whighversion)!=2)52 53 wsacleanup();54 return false;55 56 57 58 return true;59 6061 #include 62 #include63 #include 64 #pragma comment(lib, ws2_32)

17、/ 鏈接到?ws2_32.lib 65 bool initwinsock();66 void main()67 68 socket socket1;6970 initwinsock();71 struct sockaddr_in local;72 struct sockaddr_in from;73 int fromlen =sizeof(from);74 local.sin_family=af_inet;75 local.sin_port=htons(1000); /監(jiān)聽y端?口76 local.sin_addr.s_addr=inaddr_any; /本?機7778 socket1=soc

18、ket(af_inet,sock_dgram,ipproto_udp);7980 bind(socket1,(struct sockaddr*)&local,sizeof local);8182 while (1)83 84 char buffer1024=0;85 printf(udp server waiting for message from others-nn);86 if (recvfrom(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,&fromlen)!=socket_error)87 88 printf(udp

19、server receive: %sn,buffer);89 /給?cilent發(fā)信?息90 if(strcmp(buffer,gettime)=0)91 92 /獲?得?當(dāng)前系統(tǒng)3時間?93 time_t curtime;94 time(&curtime);95 strftime(buffer,sizeof(buffer),%y-%m-%d %h:%m:%s,localtime(&curtime);96 sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,fromlen);97 printf(udp server send: %sn,buffer);98 sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,fromlen

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論