2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩12頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)課程設(shè)計(jì)報(bào)告</p><p>  題 目: UDP服務(wù)器設(shè)計(jì) </p><p>  一、課程設(shè)計(jì)的目的和意義</p><p>  UDP是TCP/IP協(xié)議族為傳輸層設(shè)計(jì)的兩個(gè)協(xié)議之一,它在進(jìn)程與進(jìn)程的通信過程中,提供了有限的差錯(cuò)校驗(yàn)功能,是一種無連接的,不可靠的協(xié)議。UDP在一個(gè)較低的水平

2、上完成進(jìn)程之間的通信,在收到分組的時(shí)候沒有流量控制機(jī)制也沒有確認(rèn)機(jī)制,適用于可靠性比較高的局域網(wǎng)。由于UDP采取了無連接的方式,因此協(xié)議簡單,在一些特定的應(yīng)用中協(xié)議運(yùn)行效率高。UDP適合一些實(shí)時(shí)的應(yīng)用,如IP電話,視頻會議,它們要求源主機(jī)以恒定的速率發(fā)送數(shù)據(jù),并且在網(wǎng)絡(luò)出現(xiàn)擁塞時(shí),可以丟失一些數(shù)據(jù),但是延遲不能太大?;谶@些特點(diǎn),流式多媒體通信、多播等應(yīng)用在傳輸層采用的就是UDP協(xié)議。</p><p>  因?yàn)閁

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

4、主要的網(wǎng)絡(luò)通信技術(shù)。</p><p>  (1)程序能流暢地完成信息內(nèi)容的傳輸和接收。</p><p>  (2)要能對多個(gè)客服端進(jìn)行管理。需要通過UDP模擬多個(gè)客服端連接驗(yàn)證的情況。</p><p>  (3)操作系統(tǒng)、使用語言和編譯環(huán)境不限,但在作業(yè)中必須注明。</p><p>  三、課程設(shè)計(jì)的相關(guān)技術(shù)</p><p

5、><b>  UDP協(xié)議技術(shù)</b></p><p>  UDP是一個(gè)無連接協(xié)議,傳輸數(shù)據(jù)之前源端和終端不建立連接,當(dāng)它想傳送時(shí)就簡單地去抓取來自應(yīng)用程序的數(shù)據(jù),并盡可能快地把它扔到網(wǎng)絡(luò)上。在發(fā)送端,UDP傳送數(shù)據(jù)的速度僅僅是受應(yīng)用程序生成數(shù)據(jù)的速度、計(jì)算機(jī)的能力和傳輸帶寬的限制;在接收端,UDP把每個(gè)消息段放在隊(duì)列中,應(yīng)用程序每次從隊(duì)列中讀一個(gè)消息段。</p><

6、p><b>  C++編程技術(shù)</b></p><p>  TCP/IP協(xié)議技術(shù)</p><p>  在T C P / I P協(xié)議族中,有兩個(gè)互不相同的傳輸協(xié)議: T C P(傳輸控制協(xié)議)和U D P(用戶數(shù)據(jù)報(bào)協(xié)議)。T C P為兩臺主機(jī)提

7、供高可靠性的數(shù)據(jù)通信。它所做的工作包括把應(yīng)用程序交給它的數(shù)據(jù)分成合適的小塊交給下面的網(wǎng)絡(luò)層,確認(rèn)接收到的分組,設(shè)置發(fā)送最后確認(rèn)分組的超時(shí)時(shí)鐘等。由于運(yùn)輸層提供了高可靠性的端到端的通信,因此應(yīng)用層可以忽略所有這些細(xì)節(jié)。而另一方面, U D P則為應(yīng)用層提供一種非常簡單的服務(wù)。它只是把稱作數(shù)據(jù)報(bào)的分組從一臺主機(jī)發(fā)送到另一臺主機(jī),但并不保證該數(shù)據(jù)報(bào)能到達(dá)另一端。任何必需的可靠性必須由應(yīng)用層來提供。</p&g

8、t;<p>  TCP/IP協(xié)議與Winsock網(wǎng)絡(luò)編程接口</p><p>  Winsock規(guī)范不是一種網(wǎng)絡(luò)協(xié)議,而是一套開放的、支持多種協(xié)議的Windows寫的網(wǎng)絡(luò)編程接口。Winsock可以訪問很多種網(wǎng)絡(luò)協(xié)議,可以把它當(dāng)作一種協(xié)議的封裝。現(xiàn)在的Winsock已經(jīng)基本上實(shí)現(xiàn)了與協(xié)議無關(guān),可以使用Winsock來調(diào)用協(xié)議的功能</p><p>  Winsock API的

9、使用</p><p>  下面給出了使用Winsock進(jìn)行編程時(shí)涉及的主要函數(shù):</p><p>  WSAStartup函數(shù)、WSACleanup函數(shù)、socket函數(shù)、closesocket函數(shù)、send函數(shù)、recv函數(shù)、bind函數(shù)、listen函數(shù)、accept函數(shù)、connect函數(shù)</p><p><b>  四、課程設(shè)計(jì)過程</b&g

10、t;</p><p><b>  4、1設(shè)計(jì)思路</b></p><p>  設(shè)計(jì)UDP服務(wù)器的過程如下所示。首先,創(chuàng)建又一個(gè)Socket并監(jiān)聽。然后</p><p>  啟動線程接收數(shù)據(jù)。用一個(gè)鏈表保存所有連上的客戶,并通知連接成功。這樣,客戶就有機(jī)會處理這一事件并作一些動作。最后,當(dāng)客戶斷開時(shí),向服務(wù)器發(fā)送一個(gè)事件,服務(wù)器就可以做一些收尾工

11、作。</p><p>  其中最關(guān)鍵的部分是收發(fā)部分和數(shù)據(jù)處理部分。</p><p>  4、2服務(wù)器的主要工作流程如圖1所示:</p><p>  客戶機(jī)一方的工作流程如下:</p><p>  打開通信信道(申請一個(gè)套接字),并連接到服務(wù)器在主機(jī)的保留端口,該端口對應(yīng)服務(wù)器的UDP進(jìn)程。</p><p>  向服

12、務(wù)器發(fā)出請求報(bào)文,等待接收應(yīng)答。</p><p>  從服務(wù)器方收到最終應(yīng)答結(jié)果,或在不再請求時(shí)關(guān)閉信道并終止客戶機(jī)進(jìn)程。</p><p>  服務(wù)器一方的工作流程如下:</p><p>  打開通信信道(申請一個(gè)套接字),通知本地主機(jī)在某一保留端口接收客戶機(jī)請求。</p><p>  等待客戶機(jī)請求到達(dá)指定端口。</p>&l

13、t;p>  接收到請求,啟動一個(gè)新進(jìn)程處理用戶請求,同時(shí)釋放舊進(jìn)程以響應(yīng)新的客戶請求,一旦服務(wù)完成,關(guān)閉新進(jìn)程與客戶的通信鏈路。</p><p>  繼續(xù)等待客戶機(jī)請求。</p><p>  如果不想響應(yīng)客戶機(jī)請求,關(guān)閉服務(wù)器進(jìn)程。</p><p>  4、3主要功能模塊如下:</p><p><b>  發(fā)送</b&g

14、t;</p><p>  BOOL CUdpSock::SendBuffer(char *buff,DWORD dwBufsize,struct sockaddr FAR *lpTo)</p><p><b>  {</b></p><p>  m_lock.Lock();</p><p>  WSABUF wsabuf

15、;</p><p>  WSAOVERLAPPED over;</p><p>  DWORD dwrecv;</p><p>  DWORD dwFlags=0;</p><p>  DWORD dwRet;</p><p>  BOOL fPending;</p><p><b>

16、  int nRet;</b></p><p>  //建立 WSABUF和WSAOVERLAPPED 兩個(gè)結(jié)構(gòu)體</p><p>  fPending=FALSE;</p><p>  nRet=WSASendTo(m_Socket,</p><p><b>  &wsabuf,</b></p

17、><p><b>  1,</b></p><p><b>  &dwRecv,</b></p><p><b>  IpTo,</b></p><p>  sizeof(sockaddr),</p><p><b>  &over

18、,</b></p><p><b>  NULL);</b></p><p>  if(nRet!=0)</p><p><b>  {</b></p><p>  //檢測是否是因?yàn)閭鬏斘赐瓿啥斐傻腻e(cuò)誤</p><p><b>  else</

19、b></p><p><b>  { </b></p><p>  //否則給出出錯(cuò)信息</p><p><b>  }</b></p><p><b>  }</b></p><p>  //如果是I/O未完成</p><p&

20、gt;  if(fPending)</p><p><b>  {</b></p><p>  //等待完成請求或結(jié)束事件</p><p>  dwRet=WaitForSingleObject(over.hEvent,60000);</p><p>  //判斷是否是接收方發(fā)出的信號</p><p&

21、gt;  if(dwRet==WAIT_TIMEOUT)</p><p><b>  {</b></p><p>  CloseHandle(over.hEvent);</p><p>  TRACE("WAIT_TIMEOUT發(fā)送失敗\n",NULL);</p><p>  return FALSE

22、;</p><p><b>  }</b></p><p>  if(dwRet!=WAIT_OBJECT_0)</p><p><b>  {</b></p><p>  CloseHandle(over.hEvent);</p><p>  TRACE("發(fā)送失

23、敗\n",NULL);</p><p>  return FALSE;</p><p><b>  }</b></p><p><b>  //查看I/O信息</b></p><p>  if(!WSAGetOverlappedResult(m_socket,</p><

24、;p><b>  &over,</b></p><p><b>  &dwRecv,</b></p><p><b>  FALSE,</b></p><p>  &dwFlags))</p><p><b>  {</b>&

25、lt;/p><p>  //結(jié)束句柄會話,返回失敗信息</p><p><b>  }</b></p><p><b>  }</b></p><p>  //結(jié)束句柄會話,返回成功信息</p><p><b>  }</b></p><

26、p><b>  接收</b></p><p>  BOOL CUdpSock::RecvRequest(LPBYTE pBuf,DWORD dwBufSize,struct sockaddr FAR *lpFrom)</p><p><b>  {</b></p><p><b>  //清空接收緩沖區(qū)&l

27、t;/b></p><p>  memset(pBuf,0,dwBufSize);</p><p>  //建立 WSABUF和WSAOVERLAPPED 兩個(gè)結(jié)構(gòu)體</p><p>  wsabuf.buf=(char *)pBuf;</p><p>  wsabuf.len=dwBufSize;</p><p&g

28、t;  memset(&over,0,sizeof(WSAOVERLAPPED));</p><p>  over.hEvent=m_hEventSock;</p><p>  dwFlags=0;</p><p>  fPending=FALSE;</p><p>  int sizeAddr=sizeof(sockaddr_in)

29、;</p><p>  nRet=WSARecvFrom(m_Socket,</p><p><b>  &wsabuf,</b></p><p><b>  1,</b></p><p><b>  &dwRecv,</b></p><p&

30、gt;<b>  &dwFlags,</b></p><p><b>  lpFrom,</b></p><p>  &sizeAddr,</p><p><b>  &over,</b></p><p><b>  NULL);</b&

31、gt;</p><p>  if(nRet!=0)</p><p><b>  {</b></p><p>  //判斷傳輸是否正常完成</p><p><b>  }</b></p><p><b>  //如果完成</b></p>&l

32、t;p>  if(fPending)</p><p><b>  {</b></p><p>  //等待結(jié)束請求或退出事件</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  數(shù)據(jù)

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

34、RUE;</p><p><b>  }</b></p><p><b>  //數(shù)據(jù)的處理部分</b></p><p>  void CUdpSock::OnRead()</p><p><b>  {</b></p><p>  m_translat

35、e=0;</p><p>  sockaddr_in addrfro;</p><p>  memset(&addrfro,0,sizeof(sockaddr_in));</p><p>  addrfro.sin._family=AF_INET;</p><p>  //如果沒有接收請求就返回到讀信息函數(shù)</p>&l

36、t;p>  if(!RecvRequest((LPBYTE)m_wsaInBuffer.buf,</p><p>  sizeof(m_byInBuffer),(sockaddr*)&addrfro))</p><p><b>  {</b></p><p>  TRACE("CClientOverlappedSock:

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

38、gt;<p><b>  {</b></p><p>  m_SimpleIOBuffer.Write(m_wsaInBuffer.buf,m_translate);</p><p><b>  try{</b></p><p><b>  //處理收到的信息</b></p>

39、<p>  DelWithResData((sockaddr*)&addrfro);</p><p>  }catch(...){</p><p>  TRACE("Udp DelWithResData erro!\n");</p><p>  memset(&m_PackHead,0,sizeof(PackHead

40、));</p><p>  m_bFillHead=FALSE;</p><p><b>  }</b></p><p>  m_SimpleIOBuffer.Notify();</p><p><b>  }</b></p><p><b>  return;&l

41、t;/b></p><p><b>  }</b></p><p>  4、4程序?qū)崿F(xiàn)部分如下:</p><p><b>  客戶端程序如下:</b></p><p>  #include <winsock2.h></p><p>  #include &l

42、t;stdio.h></p><p>  #pragma comment(lib, "WS2_32") // 鏈接到WS2_32.lib </p><p>  BOOL InitWinsock();</p><p>  void main()</p><p><b>  {</b></p&

43、gt;<p>  SOCKET socket1;</p><p>  InitWinsock();</p><p>  struct sockaddr_in server;</p><p>  int len =sizeof(server);</p><p>  server.sin_family=AF_INET;</p&

44、gt;<p>  server.sin_port=htons(1000); ///server的監(jiān)聽端口</p><p>  server.sin_addr.s_addr=inet_addr("172.16.201.186"); ///server的地址 </p><p>  socket1=socket(AF_I

45、NET,SOCK_DGRAM,0);</p><p><b>  while (1)</b></p><p><b>  {</b></p><p>  char buffer[1024]="\0";</p><p>  printf("input message\n&

46、quot;);</p><p>  scanf("%s",buffer);</p><p>  if (strcmp(buffer,"bye")==0)</p><p><b>  break;</b></p><p>  if (sendto(socket1,buffer,siz

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

48、_ERROR)</p><p>  printf("rece from server:%s\n",buffer);</p><p><b>  }</b></p><p><b>  }</b></p><p>  closesocket(socket1);</p>

49、;<p><b>  }</b></p><p>  BOOL InitWinsock()</p><p><b>  {</b></p><p>  int Error;</p><p>  WORD VersionRequested;</p><p>  W

50、SADATA WsaData;</p><p>  VersionRequested=MAKEWORD(2,2);</p><p>  Error=WSAStartup(VersionRequested,&WsaData); //啟動WinSock2</p><p>  if(Error!=0)</p><p><b>  

51、{</b></p><p>  return FALSE;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  if(LOBYTE(WsaData.

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

53、p><b>  }</b></p><p>  return TRUE;</p><p><b>  }</b></p><p><b>  服務(wù)器端程序如下</b></p><p>  #include <winsock2.h></p><

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

55、 {</b></p><p>  SOCKET socket1;</p><p>  InitWinsock();</p><p>  struct sockaddr_in local;</p><p>  struct sockaddr_in from;</p><p>  int fromlen =si

56、zeof(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; ///本機(jī)</p><p>  

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

58、<p>  char buffer[1024]="\0";</p><p>  printf("waiting for message from others-------------\n");</p><p>  if (recvfrom(socket1,buffer,sizeof buffer,0,(struct sockaddr*

59、)&from,&fromlen)!=SOCKET_ERROR)</p><p><b>  {</b></p><p>  printf("Received datagram from %s--%s\n",inet_ntoa(from.sin_addr),buffer);</p><p>  ////給cil

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

61、></p><p>  closesocket(socket1);</p><p><b>  }</b></p><p>  BOOL InitWinsock()</p><p><b>  {</b></p><p>  int Error;</p>

62、<p>  WORD VersionRequested;</p><p>  WSADATA WsaData;</p><p>  VersionRequested=MAKEWORD(2,2);</p><p>  Error=WSAStartup(VersionRequested,&WsaData); //啟動WinSock2</p>

63、<p>  if(Error!=0)</p><p><b>  {</b></p><p>  return FALSE;</p><p><b>  }</b></p><p><b>  else</b></p><p><b&

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

65、t;/p><p><b>  }</b></p><p><b>  }</b></p><p>  return TRUE;</p><p><b>  }</b></p><p>  4、5 程序運(yùn)行結(jié)果截圖</p><p>  

66、將IP地址為192.168.0.5的本機(jī)作為客戶端的結(jié)果如圖2和圖3</p><p>  圖2 本機(jī)作為客戶端的發(fā)送內(nèi)容</p><p>  圖3 本機(jī)作為客戶端時(shí)服務(wù)器接收情況</p><p>  (2)將IP地址為172.168.0.11的計(jì)算機(jī)作為客戶端的結(jié)果如圖4和圖5</p><p>  圖4 局域網(wǎng)內(nèi)其他主機(jī)作為客戶端的發(fā)送內(nèi)容&

67、lt;/p><p>  圖5 局域網(wǎng)內(nèi)其他主機(jī)作為客戶端時(shí)服務(wù)器接收情況</p><p><b>  五、課程設(shè)計(jì)小結(jié)</b></p><p>  本次課程設(shè)計(jì)為時(shí)一周,我們這組的課題是UDP服務(wù)器設(shè)計(jì),其主要研究內(nèi)容在于實(shí)現(xiàn)文件的傳輸及接收。我們首先是了解UDP的定義,即確定UDP究竟是個(gè)什么協(xié)議,它有些什么性質(zhì)和特征,它應(yīng)用于那些方面。經(jīng)過了解

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

69、老師的悉心引導(dǎo),我們終于攻克了這個(gè)難題,這樣我們就把程序的功能充分的實(shí)現(xiàn)出來了。而且這次的課程設(shè)計(jì)過程中,我們接觸到了全新的編程方法-Winsock,使我們學(xué)到了新知識。具體的,通過這次的課程設(shè)計(jì),我們掌握了如下的一些新知識:</p><p> ?。?)Winsock庫的加載和卸載等。</p><p> ?。?)UDP套接字的創(chuàng)建、綁定和關(guān)閉。</p><p>  

70、(3)各張?zhí)捉幼诌x項(xiàng)的設(shè)定,如廣播類型、重用類型、數(shù)據(jù)報(bào)的TTL值等。</p><p> ?。?)UDP數(shù)據(jù)報(bào)的發(fā)送和接收方法。</p><p> ?。?)Winsock中加入組播組的方法。</p><p>  通過一個(gè)星期的努力,應(yīng)該基本上完成了課題任務(wù),成功地實(shí)現(xiàn)課題目標(biāo)。</p><p><b>  參考書目</b>

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論