udp服務器設計---課程設計_第1頁
已閱讀1頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  計算機網絡基礎課程設計報告</p><p>  題 目: UDP服務器設計 </p><p>  學生姓名: </p><p>  學 號: </p><p>  專業(yè)班級: 10計科(2

2、)班 </p><p>  指導教師: </p><p>  設計時間: 2012年下學期第18周 </p><p>  一、課程設計的目的和意義</p><p>  UDP是TCP/IP協(xié)議族為傳輸層設計的兩個協(xié)議之一,它在進程與進程的通信過程中,提供了有

3、限的差錯校驗功能,是一種無連接的,不可靠的協(xié)議。UDP在一個較低的水平上完成進程之間的通信,在收到分組的時候沒有流量控制機制也沒有確認機制,適用于可靠性比較高的局域網。由于UDP采取了無連接的方式,因此協(xié)議簡單,在一些特定的應用中協(xié)議運行效率高。UDP適合一些實時的應用,如IP電話,視頻會議,它們要求源主機以恒定的速率發(fā)送數(shù)據,并且在網絡出現(xiàn)擁塞時,可以丟失一些數(shù)據,但是延遲不能太大。基于這些特點,流式多媒體通信、多播等應用在傳輸層采用

4、的就是UDP協(xié)議。</p><p>  因為UDP具有TCP所望塵莫及的速度優(yōu)勢。雖然TCP協(xié)議中植入了各種安全保障功能,但是在實際執(zhí)行的過程中會占用大量的系統(tǒng)開銷,無疑使速度受到嚴重的影響。反觀UDP由于排除了信息可靠傳遞機制,將安全和排序等功能移交給上層應用來完成,極大降低了執(zhí)行時間,使速度得到了保證。</p><p>  二、課程設計的內容和要求</p><p&g

5、t;  編寫程序,設計UDP服務器。因為考慮到實時性,所以選擇UDP為主要的網絡通信技術。</p><p>  (1)程序能流暢地完成信息內容的傳輸和接收。</p><p>  (2)要能對多個客服端進行管理。需要通過UDP模擬多個客服端連接驗證的情況。</p><p>  (3)操作系統(tǒng)、使用語言和編譯環(huán)境不限,但在作業(yè)中必須注明。</p><

6、p>  三、課程設計的相關技術</p><p><b>  UDP協(xié)議技術</b></p><p>  UDP是一個無連接協(xié)議,傳輸數(shù)據之前源端和終端不建立連接,當它想傳送時就簡單地去抓取來自應用程序的數(shù)據,并盡可能快地把它扔到網絡上。在發(fā)送端,UDP傳送數(shù)據的速度僅僅是受應用程序生成數(shù)據的速度、計算機的能力和傳輸帶寬的限制;在接收端,UDP把每個消息段放在隊列

7、中,應用程序每次從隊列中讀一個消息段。</p><p><b>  C++編程技術</b></p><p>  TCP/IP協(xié)議技術</p><p>  在T C P / I P協(xié)議族中,有兩個互不相同的傳輸協(xié)議: T C P(傳輸控制協(xié)議)和U D

8、60;P(用戶數(shù)據報協(xié)議)。T C P為兩臺主機提供高可靠性的數(shù)據通信。它所做的工作包括把應用程序交給它的數(shù)據分成合適的小塊交給下面的網絡層,確認接收到的分組,設置發(fā)送最后確認分組的超時時鐘等。由于運輸層提供了高可靠性的端到端的通信,因此應用層可以忽略所有這些細節(jié)。而另一方面, U D P則為應用層提供一種非常簡單的服務。它只是把稱作數(shù)據報的分組從一臺主機發(fā)送到另一臺主機,但并不保證該數(shù)

9、據報能到達另一端。任何必需的可靠性必須由應用層來提供。</p><p>  TCP/IP協(xié)議與Winsock網絡編程接口</p><p>  Winsock規(guī)范不是一種網絡協(xié)議,而是一套開放的、支持多種協(xié)議的Windows寫的網絡編程接口。Winsock可以訪問很多種網絡協(xié)議,可以把它當作一種協(xié)議的封裝。現(xiàn)在的Winsock已經基本上實現(xiàn)了與協(xié)議無關,可以使用Winsock來調用協(xié)議的功能

10、</p><p>  Winsock API的使用</p><p>  下面給出了使用Winsock進行編程時涉及的主要函數(shù):</p><p>  WSAStartup函數(shù)、WSACleanup函數(shù)、socket函數(shù)、closesocket函數(shù)、send函數(shù)、recv函數(shù)、bind函數(shù)、listen函數(shù)、accept函數(shù)、connect函數(shù)</p>&

11、lt;p><b>  四、課程設計過程</b></p><p><b>  4、1設計思路</b></p><p>  設計UDP服務器的過程如下所示。首先,創(chuàng)建又一個Socket并監(jiān)聽。然后</p><p>  啟動線程接收數(shù)據。用一個鏈表保存所有連上的客戶,并通知連接成功。這樣,客戶就有機會處理這一事件并作一些動

12、作。最后,當客戶斷開時,向服務器發(fā)送一個事件,服務器就可以做一些收尾工作。</p><p>  其中最關鍵的部分是收發(fā)部分和數(shù)據處理部分。</p><p>  4、2服務器的主要工作流程如圖1所示:</p><p>  客戶機一方的工作流程如下:</p><p>  打開通信信道(申請一個套接字),并連接到服務器在主機的保留端口,該端口對應

13、服務器的UDP進程。</p><p>  向服務器發(fā)出請求報文,等待接收應答。</p><p>  從服務器方收到最終應答結果,或在不再請求時關閉信道并終止客戶機進程。</p><p>  服務器一方的工作流程如下:</p><p>  打開通信信道(申請一個套接字),通知本地主機在某一保留端口接收客戶機請求。</p><

14、p>  等待客戶機請求到達指定端口。</p><p>  接收到請求,啟動一個新進程處理用戶請求,同時釋放舊進程以響應新的客戶請求,一旦服務完成,關閉新進程與客戶的通信鏈路。</p><p>  繼續(xù)等待客戶機請求。</p><p>  如果不想響應客戶機請求,關閉服務器進程。</p><p>  4、3主要功能模塊如下:</p&

15、gt;<p><b>  發(fā)送</b></p><p>  BOOL CUdpSock::SendBuffer(char *buff,DWORD dwBufsize,struct sockaddr FAR *lpTo)</p><p><b>  {</b></p><p>  m_lock.Lock();&

16、lt;/p><p>  WSABUF wsabuf;</p><p>  WSAOVERLAPPED over;</p><p>  DWORD dwrecv;</p><p>  DWORD dwFlags=0;</p><p>  DWORD dwRet;</p><p>  BOOL fPen

17、ding;</p><p><b>  int nRet;</b></p><p>  //建立 WSABUF和WSAOVERLAPPED 兩個結構體</p><p>  fPending=FALSE;</p><p>  nRet=WSASendTo(m_Socket,</p><p><

18、b>  &wsabuf,</b></p><p><b>  1,</b></p><p><b>  &dwRecv,</b></p><p><b>  IpTo,</b></p><p>  sizeof(sockaddr),</p

19、><p><b>  &over,</b></p><p><b>  NULL);</b></p><p>  if(nRet!=0)</p><p><b>  {</b></p><p>  //檢測是否是因為傳輸未完成而造成的錯誤</p

20、><p><b>  else</b></p><p><b>  { </b></p><p>  //否則給出出錯信息</p><p><b>  }</b></p><p><b>  }</b></p><p

21、>  //如果是I/O未完成</p><p>  if(fPending)</p><p><b>  {</b></p><p>  //等待完成請求或結束事件</p><p>  dwRet=WaitForSingleObject(over.hEvent,60000);</p><p>

22、  //判斷是否是接收方發(fā)出的信號</p><p>  if(dwRet==WAIT_TIMEOUT)</p><p><b>  {</b></p><p>  CloseHandle(over.hEvent);</p><p>  TRACE("WAIT_TIMEOUT發(fā)送失敗\n",NULL);

23、</p><p>  return FALSE;</p><p><b>  }</b></p><p>  if(dwRet!=WAIT_OBJECT_0)</p><p><b>  {</b></p><p>  CloseHandle(over.hEvent);<

24、;/p><p>  TRACE("發(fā)送失敗\n",NULL);</p><p>  return FALSE;</p><p><b>  }</b></p><p><b>  //查看I/O信息</b></p><p>  if(!WSAGetOverla

25、ppedResult(m_socket,</p><p><b>  &over,</b></p><p><b>  &dwRecv,</b></p><p><b>  FALSE,</b></p><p>  &dwFlags))</p>

26、;<p><b>  {</b></p><p>  //結束句柄會話,返回失敗信息</p><p><b>  }</b></p><p><b>  }</b></p><p>  //結束句柄會話,返回成功信息</p><p><

27、;b>  }</b></p><p><b>  接收</b></p><p>  BOOL CUdpSock::RecvRequest(LPBYTE pBuf,DWORD dwBufSize,struct sockaddr FAR *lpFrom)</p><p><b>  {</b></p&g

28、t;<p><b>  //清空接收緩沖區(qū)</b></p><p>  memset(pBuf,0,dwBufSize);</p><p>  //建立 WSABUF和WSAOVERLAPPED 兩個結構體</p><p>  wsabuf.buf=(char *)pBuf;</p><p>  wsabu

29、f.len=dwBufSize;</p><p>  memset(&over,0,sizeof(WSAOVERLAPPED));</p><p>  over.hEvent=m_hEventSock;</p><p>  dwFlags=0;</p><p>  fPending=FALSE;</p><p>

30、;  int sizeAddr=sizeof(sockaddr_in);</p><p>  nRet=WSARecvFrom(m_Socket,</p><p><b>  &wsabuf,</b></p><p><b>  1,</b></p><p><b>  &

31、dwRecv,</b></p><p><b>  &dwFlags,</b></p><p><b>  lpFrom,</b></p><p>  &sizeAddr,</p><p><b>  &over,</b></p>

32、<p><b>  NULL);</b></p><p>  if(nRet!=0)</p><p><b>  {</b></p><p>  //判斷傳輸是否正常完成</p><p><b>  }</b></p><p><b&

33、gt;  //如果完成</b></p><p>  if(fPending)</p><p><b>  {</b></p><p>  //等待結束請求或退出事件</p><p><b>  }</b></p><p><b>  }</b>

34、;</p><p><b>  數(shù)據處理部分</b></p><p>  BOOL CUdpSock::DelWithResData(struct sockaddr FAR *lpFrom)</p><p><b>  {</b></p><p><b>  //接收數(shù)據的處理</b

35、></p><p>  return TRUE;</p><p><b>  }</b></p><p><b>  //數(shù)據的處理部分</b></p><p>  void CUdpSock::OnRead()</p><p><b>  {</b&g

36、t;</p><p>  m_translate=0;</p><p>  sockaddr_in addrfro;</p><p>  memset(&addrfro,0,sizeof(sockaddr_in));</p><p>  addrfro.sin._family=AF_INET;</p><p>

37、  //如果沒有接收請求就返回到讀信息函數(shù)</p><p>  if(!RecvRequest((LPBYTE)m_wsaInBuffer.buf,</p><p>  sizeof(m_byInBuffer),(sockaddr*)&addrfro))</p><p><b>  {</b></p><p> 

38、 TRACE("CClientOverlappedSock::OnRead\n");</p><p><b>  return;</b></p><p><b>  }</b></p><p>  //如果m_translate不為0,則向m_SimpleIOBuffer緩沖區(qū)寫信息</p>

39、<p>  if(m_translate)</p><p><b>  {</b></p><p>  m_SimpleIOBuffer.Write(m_wsaInBuffer.buf,m_translate);</p><p><b>  try{</b></p><p><b

40、>  //處理收到的信息</b></p><p>  DelWithResData((sockaddr*)&addrfro);</p><p>  }catch(...){</p><p>  TRACE("Udp DelWithResData erro!\n");</p><p>  memse

41、t(&m_PackHead,0,sizeof(PackHead));</p><p>  m_bFillHead=FALSE;</p><p><b>  }</b></p><p>  m_SimpleIOBuffer.Notify();</p><p><b>  }</b></p

42、><p><b>  return;</b></p><p><b>  }</b></p><p>  4、4程序實現(xiàn)部分如下:</p><p><b>  客戶端程序如下:</b></p><p>  #include <winsock2.h>

43、;</p><p>  #include <stdio.h></p><p>  #pragma comment(lib, "WS2_32") // 鏈接到WS2_32.lib </p><p>  BOOL InitWinsock();</p><p>  void main()</p><

44、;p><b>  {</b></p><p>  SOCKET socket1;</p><p>  InitWinsock();</p><p>  struct sockaddr_in server;</p><p>  int len =sizeof(server);</p><p>

45、  server.sin_family=AF_INET;</p><p>  server.sin_port=htons(1000); ///server的監(jiān)聽端口</p><p>  server.sin_addr.s_addr=inet_addr("172.16.201.186"); ///server的地址 </p&

46、gt;<p>  socket1=socket(AF_INET,SOCK_DGRAM,0);</p><p><b>  while (1)</b></p><p><b>  {</b></p><p>  char buffer[1024]="\0";</p><p

47、>  printf("input message\n");</p><p>  scanf("%s",buffer);</p><p>  if (strcmp(buffer,"bye")==0)</p><p><b>  break;</b></p><p

48、>  if (sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&server,len)!=SOCKET_ERROR)</p><p><b>  {</b></p><p>  if (recvfrom(socket1,buffer,sizeof buffer,0,(struct sock

49、addr*)&server,&len)!=SOCKET_ERROR)</p><p>  printf("rece from server:%s\n",buffer);</p><p><b>  }</b></p><p><b>  }</b></p><p&

50、gt;  closesocket(socket1);</p><p><b>  }</b></p><p>  BOOL InitWinsock()</p><p><b>  {</b></p><p>  int Error;</p><p>  WORD Versio

51、nRequested;</p><p>  WSADATA WsaData;</p><p>  VersionRequested=MAKEWORD(2,2);</p><p>  Error=WSAStartup(VersionRequested,&WsaData); //啟動WinSock2</p><p>  if(Error!

52、=0)</p><p><b>  {</b></p><p>  return FALSE;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p

53、><p>  if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)</p><p><b>  {</b></p><p>  WSACleanup();</p><p>  return FALSE;</p><p><

54、;b>  }</b></p><p><b>  }</b></p><p>  return TRUE;</p><p><b>  }</b></p><p><b>  服務器端程序如下</b></p><p>  #includ

55、e <winsock2.h></p><p>  #include <stdio.h></p><p>  #pragma comment(lib, "WS2_32") // 鏈接到WS2_32.lib </p><p>  BOOL InitWinsock();</p><p>  void ma

56、in()</p><p><b>  {</b></p><p>  SOCKET socket1;</p><p>  InitWinsock();</p><p>  struct sockaddr_in local;</p><p>  struct sockaddr_in from;<

57、;/p><p>  int fromlen =sizeof(from);</p><p>  local.sin_family=AF_INET;</p><p>  local.sin_port=htons(1000); ///監(jiān)聽端口</p><p>  local.sin_addr.s_addr=INADDR_ANY;

58、 ///本機</p><p>  socket1=socket(AF_INET,SOCK_DGRAM,0);</p><p>  bind(socket1,(struct sockaddr*)&local,sizeof local);</p><p><b>  while (1)</b></p><p&

59、gt;<b>  {</b></p><p>  char buffer[1024]="\0";</p><p>  printf("waiting for message from others-------------\n");</p><p>  if (recvfrom(socket1,buffe

60、r,sizeof buffer,0,(struct sockaddr*)&from,&fromlen)!=SOCKET_ERROR)</p><p><b>  {</b></p><p>  printf("Received datagram from %s--%s\n",inet_ntoa(from.sin_addr),buff

61、er);</p><p>  ////給cilent發(fā)信息</p><p>  sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,fromlen);</p><p><b>  }</b></p><p>  Sleep(500);<

62、/p><p><b>  }</b></p><p>  closesocket(socket1);</p><p><b>  }</b></p><p>  BOOL InitWinsock()</p><p><b>  {</b></p>

63、<p>  int Error;</p><p>  WORD VersionRequested;</p><p>  WSADATA WsaData;</p><p>  VersionRequested=MAKEWORD(2,2);</p><p>  Error=WSAStartup(VersionRequested,&a

64、mp;WsaData); //啟動WinSock2</p><p>  if(Error!=0)</p><p><b>  {</b></p><p>  return FALSE;</p><p><b>  }</b></p><p><b>  else&l

65、t;/b></p><p><b>  {</b></p><p>  if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)</p><p><b>  {</b></p><p>  WSACleanup();<

66、;/p><p>  return FALSE;</p><p><b>  }</b></p><p><b>  }</b></p><p>  return TRUE;</p><p><b>  }</b></p><p>  

67、4、5 程序運行結果截圖</p><p>  將IP地址為192.168.0.4的本機作為客戶端的結果如圖2和圖3</p><p>  圖2 本機作為客戶端的發(fā)送內容</p><p>  圖3 本機作為客戶端時服務器接收情況</p><p>  (2)將IP地址為1192.168.0.4的計算機作為客戶端的結果如圖4和圖5</p>

68、<p>  圖4 局域網內其他主機作為客戶端的發(fā)送內容</p><p>  圖5 局域網內其他主機作為客戶端時服務器接收情況</p><p><b>  五、課程設計小結</b></p><p>  本次試驗主要是探究源主機以恒定的速率發(fā)送數(shù)據以及客戶端接受數(shù)據。UDP是TCP/IP協(xié)議族為傳輸層設計的兩個協(xié)議之一,是一種無連接的

69、,不可靠的協(xié)議。由于UDP采取了無連接的方式,因此協(xié)議簡單,在一些特定的應用中協(xié)議運行效率高。UDP適合一些實時的應用,如IP電話、視頻會議,它們要求源主機以恒定的速率發(fā)送數(shù)據,并且在網絡出現(xiàn)擁塞時,可以丟失一些數(shù)據,但是延遲不能太大。基于這些特點,流式多媒體通信、多播等應用在傳輸層采用的就是UDP協(xié)議。 編寫一UDP服務器程序,流暢地完成視頻文件地傳輸,要能對多個客戶端進行管理。需要通過UDP模擬多個客戶端連接驗證的情況。</p

70、><p>  UDP是TCP/IP協(xié)議族為傳輸層設計的兩個協(xié)議之一,它在進程與進程的通信過程中,提供了有限的差錯校驗功能,是一種無連接的、不可靠的協(xié)議。分析后知道了UDP其實就是用來實現(xiàn)網絡中文件的傳輸和接收的協(xié)議。知道它的實質后,接下來我們就開始思考具體的UDP實現(xiàn)的程序,該程序分為客戶端和服務器端兩部分,客戶端主要是執(zhí)行文件或消息的發(fā)送,服務器端則主要是接收這些內容。整個程序最重要也是最有難度的部分就是如何把發(fā)送

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論