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

下載本文檔

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

文檔簡介

1、<p>  計算機學院計算機科學與技術專業(yè)</p><p>  《網(wǎng)絡工程案例教學及綜合實踐》報告</p><p> ?。?012/2013學年 第一學期)</p><p>  學生姓名: </p><p>  學生班級: </p><p>  學生學號: </p&

2、gt;<p>  指導教師: </p><p><b>  2013年1月3日</b></p><p><b>  目錄</b></p><p><b>  一.設計目的:1</b></p><p><b>  二.設計內(nèi)容:

3、1</b></p><p><b>  三.原理分析:1</b></p><p>  3.1套接字的概念:1</p><p>  3.2 WinSock應用程序接口:2</p><p>  3.3 工作模型2</p><p><b>  總體設計:2</b&g

4、t;</p><p>  4.1基于TCP(面向連接)的Socket編程3</p><p>  4.2基于UDP(面向無連接)的socket編程4</p><p><b>  五.詳細設計:4</b></p><p>  六.運行結果:12</p><p><b>  一.設計目

5、的:</b></p><p>  理解客戶機/服務器模型的工作原理;</p><p><b>  掌握套接字的概念;</b></p><p>  掌握基于套接字的面向連接和無連接客戶機/服務器程序的設計原理和相關的WinSock API函數(shù);</p><p>  掌握基于TCP和UDP的程序設計方法。<

6、/p><p><b>  二.設計內(nèi)容:</b></p><p>  基于TCP的應用編程:編寫一個Client/Server程序?qū)?,服務器程序負責接收客戶機進程的連接請求,并在服務器進程與客戶機進程之間建立通信連接,然后接收客戶機進程的傳送數(shù)據(jù)并將其顯示在服務器端,同時將歡迎信息發(fā)送給客戶機進程,最后關閉該客戶機進程的連接;客戶機進程首先提出對指定服務器的連接請求,建立

7、連接后向服務器進程發(fā)送已經(jīng)建立連接的數(shù)據(jù)信息,同時接收服務器進程發(fā)送過來的數(shù)據(jù)并顯示在客戶端。采用WinSock API實現(xiàn)代碼。</p><p>  基于UDP的應用編程:實現(xiàn)一個基于UDP的客戶機/服務器程序,通過設定不同的命令行參數(shù)來確定應用進程的不同角色,即充當客戶機進程還是服務器進程。當兩個進程運行后,彼此之間可以輪流發(fā)送消息,對方接收后顯示出來。</p><p><b&g

8、t;  三.原理分析:</b></p><p>  3.1套接字的概念:</p><p>  套接字(Socket) 1. Socket的出現(xiàn),使得程序員可以很方便的訪問TCP/IP,從而開發(fā)各種網(wǎng)絡應用的程序 2. 套接字存在于通信區(qū)域中,通信區(qū)域也叫地址族,他是一個抽象的概念,主要用于通過套接字通信的進程的共有特性綜合在一起。套接字通常只與同一個區(qū)域的套接字交換數(shù)據(jù)。

9、套接字的類型 1. 流式套接字(SOCK_STREAM) 提供面向連接的,可靠的數(shù)據(jù)傳輸服務,數(shù)據(jù)無差錯,無重復的發(fā)送,且按發(fā)送的順序接收,基于TCP協(xié)議 ;2. 數(shù)據(jù)保式套接字(SOCK_DGRAM) 提供無連接的服務,數(shù)據(jù)包以獨立包形式發(fā)送,不提供無錯誤的保證,數(shù)據(jù)可能丟失或重復,且接收順序混亂,基于UDP協(xié)議。</p><p>  3.2 WinSock應用程序接口:</p><

10、;p>  WinSock是一個基于套接字模型的API(應用程序接口),在Microsoft Windows操作系統(tǒng)類中使用。它在Berkekley接口函數(shù)的基礎上,還增加了基于消息驅(qū)動機制的Windows擴展函數(shù)。其中WinSock 1.1只支持TCP/IP網(wǎng)絡,WinSock2.0則增加了對更多協(xié)議的支持。WinSock包括以下3類的函數(shù):</p><p>  1.WinSock API包含的Berkel

11、ey Socket函數(shù)。這類函數(shù)分兩部分,其一是用于網(wǎng)絡I/P的函數(shù);其二是不涉及網(wǎng)絡I/O,在本地端完成的函數(shù)。</p><p>  2.檢索有關域名,通信服務和協(xié)議等Internet信息的數(shù)據(jù)庫函數(shù)。</p><p>  3.Berkekley Socket API的Windows轉用的擴展函數(shù)。</p><p><b>  3.3 工作模型</

12、b></p><p>  網(wǎng)絡應用程序一般是以客戶機/服務器的模型的方式工作的。而因特網(wǎng)便是客戶機/服務器模型的一個典型應用。在這種工作方式中,一個服務器程序通常事先啟動,并在一個熟知端口偵聽對服務器的請求,如FTP服務器,Web服務器等。當客戶機應用程序需要某種服務時,需向提供這種服務的服務器發(fā)出請求,服務器在接收到請求后,向客戶機發(fā)出相應請求信息。這樣客戶機應用程序和服務器程序之間便建立了通信連接,此后

13、可以進行數(shù)據(jù)通信。通信任務完成后需要關閉它們之間的通信連接?;赥CP(面向連接)和基于UDP(面向非連接)應用程序的工作流程如下所示:</p><p><b>  四.總體設計:</b></p><p>  4.1基于TCP(面向連接)的Socket編程:服務器端順序: 1. 加載套接字庫 2. 創(chuàng)建套接字(socket) 3. 將套接字綁定到一個本地地址和

14、端口上(bind) 4. 將套接字設為監(jiān)聽模式,準備接收客戶請求(listen) 5. 等待客戶請求的到來;當請求帶來后,接受連接請求,返回一個新的對應于此次連接的套接字(accept) 6. 用返回的套接字和客戶端進行通信(send/recv) 7. 返回,等待另一個客戶請求 8. 關閉套接字(closesocket) 客戶端程序: 1. 加載套接字庫 2. 創(chuàng)建套接字(socket) 3. 向服務器發(fā)送連接請求(c

15、onnect) 4. 和服務器端進行通信(send/receive) 5. 關閉套接字(closesocket) 4.2基于UDP(面向無連接)的socket編程 :服務器端(接收端)程序: 1. 加載套接字庫 2. 創(chuàng)建套接字(socket) 3. 將套接字綁定到一個本地地址和端口上(bind) 4. 等待接收數(shù)據(jù)(recvfrom) 5. 關閉套接字(closesocket)</p><p>

16、;<b>  五.詳細設計:</b></p><p>  (一).基于TCP的服務器/客戶機程序:</p><p>  服務器端TCPserver.cpp:</p><p>  #include<winsock2.h></p><p>  #include<iostream></p>

17、<p>  using namespace std;</p><p>  #include <string.h></p><p>  void main() </p><p><b>  { </b></p><p>  //加載套接字(winsock)庫</p><p>

18、  WORD wVersionRequested; </p><p>  WSADATA wsaData; </p><p><b>  int err; </b></p><p>  wVersionRequested = MAKEWORD( 2, 2 ); //版本號為2.2</p><p>  err = WSAS

19、tartup( wVersionRequested, &wsaData ); </p><p>  if ( err != 0 ) { </p><p><b>  return; </b></p><p><b>  } </b></p><p>  if ( LOBYTE( wsaDat

20、a.wVersion ) != 2 || </p><p>  HIBYTE( wsaData.wVersion ) != 2 ) { </p><p>  WSACleanup( ); </p><p><b>  return; </b></p><p><b>  } </b></p&g

21、t;<p><b>  //創(chuàng)建套接字 </b></p><p>  SOCKET sockServer=socket(AF_INET,SOCK_STREAM,0); //SOCK_STREAM參數(shù)設置為TCP連接 </p><p>  SOCKADDR_IN addrServer; //設置服務器端套接字的相關屬性 </p><p&

22、gt;  addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //設置IP </p><p>  addrServer.sin_family=AF_INET; </p><p>  addrServer.sin_port=htons(5000); //設置端口號 </p><p>  //將套接字綁定到本地地址和指定

23、端口上 </p><p>  bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR)); </p><p>  //將套接字設置為監(jiān)聽模式,并將最大請求連接數(shù)設置成5,超過此數(shù)的請求全部作廢 </p><p>  listen(sockServer,5); </p><p>  

24、SOCKADDR_IN addrClient; //用來接收客戶端的設置,包括IP和端口 </p><p>  int len=sizeof(SOCKADDR); </p><p>  while(1) //不斷監(jiān)聽 </p><p><b>  { </b></p><p>  //得到創(chuàng)建連接后的一個新的套接字,用來

25、和客戶端進行溝通,原套接字繼續(xù)監(jiān)聽客戶的連接請求 </p><p>  SOCKET sockConn=accept(sockServer,(SOCKADDR*)&addrClient, &len); </p><p>  if(sockConn!=INVALID_SOCKET) //創(chuàng)建成功 </p><p><b>  { </b

26、></p><p>  char sendInfo[100]; </p><p>  //inet_ntoa將結構轉換為十進制的IP地址字符串 </p><p>  sprintf(sendInfo,"welcome %s to this test!",inet_ntoa(addrClient.sin_addr)); </p>

27、<p>  //成功建立連接后向客戶端發(fā)送數(shù)據(jù),結果將顯示在客戶端上 </p><p>  send(sockConn,sendInfo,strlen(sendInfo)+1,0); </p><p>  //從客戶端接收數(shù)據(jù),結果顯示在服務器上 </p><p>  char recvInfo[100]; </p><p>  

28、recv(sockConn,recvInfo,100,0); </p><p>  printf("%s\n",recvInfo); </p><p>  //將本次建立連接中得到套接字關閉 </p><p>  closesocket(sockConn); </p><p><b>  } </b>

29、</p><p><b>  else </b></p><p><b>  { </b></p><p>  int errCode=WSAGetLastError(); </p><p>  printf("the errcode is:%d\n",errCode); <

30、;/p><p><b>  } </b></p><p><b>  } </b></p><p>  //如果本程序不是死循環(huán),那么在此處還應添加以下代碼: </p><p>  closesocket(sockServer); //對一直處于監(jiān)聽狀態(tài)的套接字進行關閉 </p><

31、p>  WSACleanup(); //終止對winsocket庫的使用 </p><p><b>  }</b></p><p>  客戶端TCPclient.cpp:</p><p>  #include<winsock2.h></p><p>  #include<iostream>&

32、lt;/p><p>  using namespace std;</p><p>  #include <string.h></p><p>  void main() </p><p><b>  { </b></p><p><b>  //加載套接字庫 </b>

33、</p><p>  WORD wVersionRequested; </p><p>  WSADATA wsaData; </p><p><b>  int err; </b></p><p>  wVersionRequested = MAKEWORD( 2, 2 ); //版本號為2.2 </p>

34、<p>  err = WSAStartup( wVersionRequested, &wsaData ); </p><p>  if ( err != 0 ) { </p><p><b>  return; </b></p><p><b>  } </b></p><p>

35、;  if ( LOBYTE( wsaData.wVersion ) != 2 || </p><p>  HIBYTE( wsaData.wVersion ) != 2 ) { </p><p>  WSACleanup( ); </p><p><b>  return; </b></p><p><b>

36、  } </b></p><p>  SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); //SOCK_STREAM參數(shù)設置為TCP連接 </p><p>  SOCKADDR_IN addrServer; //服務器地址結構 </p><p>  addrServer.sin_addr.S_un.S_add

37、r=inet_addr("127.0.0.1"); //服務器地址 </p><p>  addrServer.sin_port=htons(5000); //服務器端口號 </p><p>  addrServer.sin_family=AF_INET; </p><p>  //與服務器端建立連接,進行通信 </p><p

38、>  int connReult=connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR)); </p><p>  if(connReult!=WSAEADDRNOTAVAIL) //訪問成功 </p><p><b>  { </b></p><p>  //成功建立

39、連接后向服務器端發(fā)送數(shù)據(jù),結果將顯示在服務器端上 </p><p>  send(sockClient,"this is lisi!",strlen("this is zhangsan!")+1,0); </p><p>  //接收來自服務器端發(fā)送來的信息 </p><p>  char recvInfo[100]; <

40、;/p><p>  recv(sockClient,recvInfo,100,0); </p><p>  printf("%s\n",recvInfo); </p><p><b>  } </b></p><p><b>  else </b></p><p&

41、gt;<b>  { </b></p><p>  int errCode=WSAGetLastError(); </p><p>  printf("the errcode is:%d\n",errCode); </p><p><b>  } </b></p><p>  c

42、losesocket(sockClient); </p><p>  WSACleanup(); </p><p><b>  }</b></p><p>  (二)基于UDP的服務器/客戶機程序:</p><p>  服務端UDPserver.cpp:</p><p>  #include &l

43、t;winsock2.h></p><p>  #include <iostream></p><p>  using namespace std;</p><p>  void main() </p><p><b>  { </b></p><p>  //加載套接字(win

44、sock)庫,加載這段代碼拷貝于MSDN中WSAStartup的介紹 </p><p>  WORD wVersionRequested; </p><p>  WSADATA wsaData; </p><p><b>  int err; </b></p><p>  wVersionRequested = MAKE

45、WORD( 2, 2 ); //版本號為2.2 </p><p>  err = WSAStartup( wVersionRequested, &wsaData ); </p><p>  if ( err != 0 ) { </p><p><b>  return; </b></p><p><b>

46、;  } </b></p><p>  if ( LOBYTE( wsaData.wVersion ) != 2 || </p><p>  HIBYTE( wsaData.wVersion ) != 2 ) { </p><p>  WSACleanup( ); </p><p><b>  return; </

47、b></p><p><b>  } </b></p><p><b>  //創(chuàng)建套接字 </b></p><p>  //注意第二個參數(shù)和TCP設置不同 </p><p>  SOCKET sockServer=socket(AF_INET,SOCK_DGRAM,0); </p>

48、;<p>  SOCKADDR_IN addrServer; //設置服務器端套接字的地址結構的相關屬性 </p><p>  addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //設置IP </p><p>  addrServer.sin_family=AF_INET; </p><p>  ad

49、drServer.sin_port=htons(6000); //設置端口號 </p><p>  //將套接字和服務器地址結構綁定 </p><p>  bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR)); </p><p>  SOCKADDR_IN addrClient; </p>

50、;<p>  int len=sizeof(SOCKADDR); </p><p>  char recvBuf[100]; </p><p>  char tempBuf[100]; </p><p>  char sendBuf[100]; </p><p><b>  while(1) </b><

51、;/p><p><b>  { </b></p><p>  //從客戶端接收數(shù)據(jù) </p><p>  int result=recvfrom(sockServer,recvBuf,100,0,(SOCKADDR *)&addrClient,&len); </p><p>  if(result==SOCK

52、ET_ERROR) </p><p><b>  { </b></p><p>  int errCode=WSAGetLastError(); </p><p>  printf("error:%d",errCode); </p><p>  break; //退出循環(huán) </p>&l

53、t;p><b>  } </b></p><p><b>  else </b></p><p><b>  { </b></p><p>  if(recvBuf[0]=='q') //對方請求退出 </p><p><b>  { </

54、b></p><p>  //同樣將退出請求發(fā)送回去 </p><p>  sendto(sockServer,"q",strlen("q")+1,0,(SOCKADDR*)& addrClient,sizeof(SOCKADDR)); </p><p>  printf("the chat end!&

55、quot;); </p><p><b>  break; </b></p><p><b>  } </b></p><p><b>  else </b></p><p><b>  { </b></p><p>  //將對方

56、發(fā)送過來的信息前段加上IP地址進行輸出 </p><p>  sprintf(tempBuf,"%s said:%s",inet_ntoa(addrClient.sin_addr),recvBuf); </p><p>  printf("%s\n",tempBuf); </p><p>  //將用戶的鍵盤輸入發(fā)送到對方 &

57、lt;/p><p>  printf("pleas input the message:\n"); </p><p>  gets(sendBuf); //得到鍵盤輸入內(nèi)容 </p><p>  sendto(sockServer,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)& addrClient,size

58、of(SOCKADDR)); </p><p><b>  } </b></p><p><b>  } </b></p><p><b>  } </b></p><p>  closesocket(sockServer); </p><p>  WS

59、ACleanup(); </p><p><b>  }</b></p><p>  客戶端UDPclient.cpp:</p><p>  #include <winsock2.h></p><p>  #include <iostream></p><p>  usin

60、g namespace std;</p><p>  void main() </p><p><b>  { </b></p><p>  //加載套接字(winsock)庫,加載這段代碼拷貝于MSDN中WSAStartup的介紹 </p><p>  WORD wVersionRequested; </p>

61、;<p>  WSADATA wsaData; </p><p><b>  int err; </b></p><p>  wVersionRequested = MAKEWORD( 2, 2 ); //版本號為2.2 </p><p>  err = WSAStartup( wVersionRequested, &ws

62、aData ); </p><p>  if ( err != 0 ) { </p><p><b>  return; </b></p><p><b>  } </b></p><p>  if ( LOBYTE( wsaData.wVersion ) != 2 || </p>&

63、lt;p>  HIBYTE( wsaData.wVersion ) != 2 ) { </p><p>  WSACleanup( ); </p><p><b>  return; </b></p><p><b>  } </b></p><p><b>  //創(chuàng)建套接字 &l

64、t;/b></p><p>  SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0); //注意第二個參數(shù)和TCP設置不同 </p><p>  SOCKADDR_IN addrServer; //服務器地址結構 </p><p>  addrServer.sin_addr.S_un.S_addr=inet_addr(&

65、quot;127.0.0.1"); //服務器地址 </p><p>  addrServer.sin_family=AF_INET; </p><p>  addrServer.sin_port=htons(6000); //服務器端口號 </p><p>  char tempBuf[100]; </p><p>  char

66、recvBuf[100]; </p><p>  char sendBuf[100]; </p><p>  int len=sizeof(SOCKADDR); </p><p><b>  while(1) </b></p><p><b>  { </b></p><p>

67、;  printf("plese input the message:\n"); </p><p>  gets(sendBuf); //得到用戶的鍵盤輸入 </p><p>  sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrServer,sizeof(SOCKADDR)); <

68、/p><p>  int result=recvfrom(sockClient,recvBuf,100,0,(SOCKADDR *)&addrServer,&len); </p><p>  if(result==SOCKET_ERROR) </p><p><b>  { </b></p><p>  in

69、t errCode=WSAGetLastError(); </p><p>  printf("error:%d",errCode); </p><p>  break; //退出循環(huán) </p><p><b>  } </b></p><p><b>  else </b>&l

70、t;/p><p><b>  { </b></p><p>  if(recvBuf[0]=='q') //對方請求退出 </p><p><b>  { </b></p><p>  //同樣將退出請求發(fā)送回去 </p><p>  sendto(sockCli

71、ent,"q",strlen("q")+1,0,(SOCKADDR*)& addrServer,sizeof(SOCKADDR)); </p><p>  printf("the chat end!"); </p><p><b>  break; </b></p><p>&

72、lt;b>  } </b></p><p><b>  else </b></p><p><b>  { </b></p><p>  //將對方發(fā)送過來的信息前段加上IP地址進行輸出 </p><p>  sprintf(tempBuf,"%s said:%s&quo

73、t;,inet_ntoa(addrServer.sin_addr),recvBuf); </p><p>  printf("%s\n",tempBuf); </p><p><b>  } </b></p><p><b>  } </b></p><p><b> 

74、 } </b></p><p>  closesocket(sockClient); </p><p>  WSACleanup(); </p><p><b>  }</b></p><p><b>  六.運行結果:</b></p><p>  程序運行結果如

溫馨提示

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

評論

0/150

提交評論