




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、計算機通信網(wǎng)絡(luò)實驗UDP/TCP通信實驗 學(xué)院: 班級: 學(xué)號: 姓名: 2012年11月6日一、 實驗?zāi)康氖炀氄莆誙DP、TCP Client/Server模式的通信原理二、 實驗內(nèi)容傳輸控制協(xié)議(Transport Control Protocol)是一種面向連接的,可靠的傳輸層協(xié)議。面向連接是指一次正常的TCP傳輸需要通過在TCP客戶端和TCP服務(wù)端建立特定的虛電路連接來完成,該過程通常被稱為“三次握手”??煽啃钥梢酝ㄟ^很多種方法來提供保證,在這里我們關(guān)心的是數(shù)據(jù)序列和確認。TCP通過數(shù)據(jù)分段(Segment)中的序列號保證所有傳輸?shù)臄?shù)據(jù)可以在遠端按照正常的次序進行重組,而且通過確認保證
2、數(shù)據(jù)傳輸?shù)耐暾浴Rㄟ^TCP傳輸數(shù)據(jù),必須在兩端主機之間建立連接。舉例說明,TCP客戶端需要和TCP服務(wù)端建立連接,過程如圖所示:第一步中,客戶端向服務(wù)端提出連接請求。這時TCP SYN標志置位??蛻舳烁嬖V服務(wù)端序列號區(qū)域合法,需要檢查??蛻舳嗽赥CP報頭的序列號區(qū)中插入自己的ISN。服務(wù)端收到該TCP分段后,在第二步以自己的ISN回應(yīng)(SYN標志置位),同時確認收到客戶端的第一個TCP分段(ACK標志置位)。在第三步中,客戶端確認收到服務(wù)端的ISN(ACK標志置位)。到此為止建立完整的TCP連接,開始全雙工模式的數(shù)據(jù)傳輸過程。根據(jù)以上內(nèi)容編寫一個TCP Client/Server模式的通信
3、程序。事實上網(wǎng)絡(luò)程序是由兩個部分組成:客戶端、服務(wù)器端它們的建立步驟如下:服務(wù)器端 socket->bind->listen->accept客戶端 socket->connect三、 實驗步驟1. 編寫UDP、TCP Client/Server模式的通信程序;2. 調(diào)試并運行自己編寫的實現(xiàn)程序;3. 了解TCP Client/Server模式的工作原理,比較二者的不同,如出現(xiàn)異常情況,在實驗報告中寫出原因分析;4. 保留編寫的實現(xiàn)程序。四、 實驗過程1. TCP Client/Server模式的通信程序服務(wù)器端操作 socket(套接字):1在初始化階段調(diào)用WSASta
4、rtup() 2、建立Socket3、綁定端口4、監(jiān)聽5、服務(wù)器端接受客戶端的連接請求6、發(fā)送及接收信息7、結(jié)束 socket 連接相應(yīng)的程序:/* server.c *#include<winsock.h> /WINSOCK API的頭文件,需要包含在項目中#pragma comment(lib,"ws2_32.lib") /WINSOCK API連接庫文件#include<stdio.h>#include<string.h>void main()WORD wVersionRequested; WSADATA wsaData; int
5、err; int len; char recvBuf50; char sendBuf50; SOCKET sockSrv; /用于服務(wù)器監(jiān)聽的Socket SOCKADDR_IN addrSrv; /存放服務(wù)端套接字信息 SOCKADDR_IN addrClient; /存放連接上的客戶端套接字信息SOCKET new_sock; /用于連接后新的socket/* 初始化階段 * wVersionRequested = MAKEWORD( 1, 1 ); /WinSocket1.1版本 err = WSAStartup( wVersionRequested, &wsaData ); /
6、此函數(shù)在應(yīng)用程序中初始化Windows Sockets DLL ,只有此函數(shù)調(diào)用成功后,才可以再調(diào)用其他Windows Sockets DLL中的API函數(shù) /wsaData用來存儲系統(tǒng)傳回的關(guān)于WinSocket的資料 if ( err != 0 ) /err=0就表示初始化成功 return; if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return;/* 建立socket * sockSrv=socket(AF_INET,SOCK_STREAM,0);/調(diào)用
7、Socket()函數(shù)在服務(wù)器建立監(jiān)聽的Socket,并定義此Socket所使用的通信協(xié)議。/指定地址描述為AF_INET/指定socket類型為SOCK_STREAM,建立的是遵從TCP/IP協(xié)議的socketif(sockSrv=-1)return; /錯誤檢查/* 綁定端口 * addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /設(shè)置服務(wù)器地址,INADDR_ANY表示使用自己的IP地址 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); /設(shè)定端口為6000 if(bind(so
8、ckSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)=-1)return;/ 綁定端口并檢查/* 監(jiān)聽 * if(listen(sockSrv,5)=-1)return;/使服務(wù)器端的Socket進入監(jiān)聽狀態(tài),并設(shè)定可以建立的最大連接數(shù)為5/* 發(fā)送及接受消息 * len=sizeof(SOCKADDR_IN); /Socket的地址值的長度 while(1)new_sock=accept(sockSrv,(SOCKADDR*)&addrClient,&len);/ 接受客戶端連接,獲取客戶端的ip地址 if(new_sock=-1)co
9、ntinue;printf("got connection from client:%sn-Input "exit" to disconnect from client.-n",inet_ntoa(addrClient.sin_addr);/ 接受客戶端連接,獲取客戶端的ip地址printf("Server:");scanf("%s",sendBuf); /輸入服務(wù)器要發(fā)送的消息,或者輸入exit可斷開連接while(strcmp(sendBuf,"exit")!=0)send(new_sock
10、,sendBuf,strlen(sendBuf)+1,0);/ 發(fā)送消息到客戶端recv(new_sock,recvBuf,50,0);/ 接受客戶端消息if(strcmp(recvBuf,"exit")=0)break;printf("Client:%snServer:",recvBuf); scanf("%s",sendBuf); /輸入服務(wù)器要發(fā)送的消息,或者輸入exit可斷開連接 send(new_sock,"exit",5,0);/ 發(fā)送消息到客戶端printf("-The session is
11、 terminated!-n"); closesocket(new_sock);/斷開連接/* end of program *客戶端操作 socket(套接字):1在初始化階段調(diào)用WSAStartup() 2、建立Socket3、設(shè)置服務(wù)器地址及端口號4、連接服務(wù)器5、發(fā)送及接收信息6、結(jié)束 socket 連接#include <stdio.h>#include <Winsock2.h> /WINSOCK API的頭文件,需要包含在項目中#pragma comment(lib, "ws2_32.lib") /WINSOCK API連接庫文
12、件#include <string.h>void main() WORD wVersionRequested; WSADATA wsaData; /WSAata用來存儲系統(tǒng)傳回的關(guān)于WinSocket的資料。 int err;SOCKET sockClient; SOCKADDR_IN addrSrv;char recvBuf50;char sendBuf50;/* 初始化階段 * wVersionRequested = MAKEWORD( 1, 1 ); /WinSocket1.1版本 err = WSAStartup( wVersionRequested, &wsaDa
13、ta );/此函數(shù)在應(yīng)用程序中初始化Windows Sockets DLL ,只有此函數(shù)調(diào)用成功后,才可以再調(diào)用其他Windows Sockets DLL中的API函數(shù) /wsaData用來存儲系統(tǒng)傳回的關(guān)于WinSocket的資料 if ( err != 0 )return; if ( LOBYTE( wsaData.wVersion ) != 1 |HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return; /* 建立socket、發(fā)送、接受消息 * sockClient=socket(AF_INET,SOCK_STREAM,0);/
14、AF_INET .tcp連接 /初始化連接與端口號 addrSrv.sin_addr.S_un.S_addr=inet_addr("222.25.162.196"); /設(shè)置服務(wù)器地址 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); / 設(shè)置端口號 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR);/連接服務(wù)器 printf("-got connection from server.-n-Input "exit&quo
15、t; to disconnect from server.-n"); recv(sockClient,recvBuf,50,0);/接受數(shù)據(jù) while(strcmp(recvBuf,"exit")!=0) printf("Server:%snClient:",recvBuf); scanf("%s",sendBuf); /輸入服務(wù)器要發(fā)送的消息 if(strcmp(sendBuf,"exit")=0)send(sockClient,"exit",5,0);break; send(so
16、ckClient,sendBuf,strlen(sendBuf)+1,0);/發(fā)送數(shù)據(jù) recv(sockClient,recvBuf,50,0);/接受數(shù)據(jù)printf("-The session is terminated!-n"); closesocket(sockClient);/關(guān)閉連接 WSACleanup();試驗過程:1、在IP地址為:222.25.162.196的主機上打開服務(wù)器;2、在IP地址為:222.25.162.84的主機上打開客戶端;3、在IP地址為:222.25.162.5的主機上也打開客戶端;4、服務(wù)器與IP地址為:222.25.162.84
17、的主機進行通信,然后斷開連接;5、服務(wù)器與IP地址為:222.25.162.5的主機進行通信,然后斷開連接;IP地址為:222.25.162.196的主機上的截圖IP地址為:222.25.162.84的主機上的截圖IP地址為:222.25.162.5的主機上的截圖分析:客戶端1:IP地址為:222.25.162.84客戶端2:IP地址為:222.25.162.5從截圖上可以看出服務(wù)器先與客戶端1連接上,建立步驟為:服務(wù)器端 socket->bind->listen->accept客戶端 socket->connect當它們通信結(jié)束斷開連接后,服務(wù)器再與客戶端2連接進行通
18、信。這是因為在accept()函數(shù)中,當某個客戶端試圖與服務(wù)器監(jiān)聽的端口連接時,該連接請求將排隊等待服務(wù)器用accept接收它并為其建立一個連接。當客戶端2試圖與服務(wù)器監(jiān)聽的端口連接時,服務(wù)器正在與客戶端1通信,因此它排隊等候。當服務(wù)器斷開與客戶端1的連接后,服務(wù)器用accept將排隊等待的客戶端2接收并為其建立一個連接,與其通信。2. UDP Client/Server模式的通信程序 服務(wù)器端操作 socket(套接字):1在初始化階段調(diào)用WSAStartup() 2、建立Socket3、綁定端口4、發(fā)送及接收信息5、結(jié)束 socket 連接/* server.c *#include<
19、winsock.h> /WINSOCK API的頭文件,需要包含在項目中#pragma comment(lib,"ws2_32.lib") /WINSOCK API連接庫文件#include<stdio.h>#include<string.h>const int bufferlen=1024; /緩存器大小void main()WORD wVersionRequested; WSADATA wsaData; int err; int len;int fromlen=sizeof(struct sockaddr); char recvBufbuf
20、ferlen; /接受緩存 char sendBufbufferlen; /發(fā)送緩存 SOCKET sockSrv; /用于服務(wù)器監(jiān)聽的Socket SOCKADDR_IN addrSrv; /服務(wù)端地址 SOCKADDR_IN addrClient; /客戶端地址/* 初始化階段 * wVersionRequested = MAKEWORD( 1, 1 ); /WinSocket1.1版本 err = WSAStartup( wVersionRequested, &wsaData ); /wsaData用來存儲系統(tǒng)傳回的關(guān)于WinSocket的資料 if ( err != 0 ) /
21、err=0就表示初始化成功return; if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return;/* 建立socket * sockSrv=socket(AF_INET,SOCK_DGRAM,0);/調(diào)用Socket()函數(shù)在服務(wù)器建立監(jiān)聽的Socket,并定義此Socket所使用的通信協(xié)議。/指定socket類型為SOCK_DGRAM,使用不連續(xù)不可靠的數(shù)據(jù)包連接,即UDP協(xié)議if(sockSrv=-1)return; /錯誤檢查/* 綁定端口 * addr
22、Srv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /設(shè)置服務(wù)器地址,INADDR_ANY表示使用自己的IP地址 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); /設(shè)定端口為6000 if(bind(sockSrv,(LPSOCKADDR)&addrSrv,sizeof(SOCKADDR)=-1)return;/ 綁定端口并檢查/* 發(fā)送及接受消息 * len=sizeof(SOCKADDR_IN); /Socket的地址值的長度 memset(recvBuf,0,sizeof(re
23、cvBuf); /初始化接收緩沖區(qū)printf("-Server waiting.-n"); while(1)recvfrom(sockSrv,recvBuf,bufferlen,0,(SOCKADDR*)&addrClient,&fromlen);/從客戶端接收數(shù)據(jù)if(strcmp(recvBuf,"exit")=0) /如果接受到exit指令,直接continue,等待接受下一個客戶端的連接printf("-The session with %s is terminated!-nn",inet_ntoa(addr
24、Client.sin_addr);continue; printf("client-%s:%sn",inet_ntoa(addrClient.sin_addr),recvBuf);/輸出客戶IP地址、端口號和接收到的數(shù)據(jù)printf("server:");scanf("%s",sendBuf); /輸入服務(wù)器要發(fā)送的消息,或者輸入exit可斷開連接if(strcmp(sendBuf,"exit")=0)sendto(sockSrv,"exit",5,0,(SOCKADDR *)&addr
25、Client,len);printf("-The session with %s is terminated!-nn",inet_ntoa(addrClient.sin_addr);continue; sendto(sockSrv,sendBuf,sizeof(sendBuf)+1,0,(SOCKADDR *)&addrClient,len); /給客戶發(fā)送信息printf("n"); closesocket(sockSrv); /關(guān)閉連接WSACleanup();/* end of program *客戶端操作 socket(套接字):1在初始
26、化階段調(diào)用WSAStartup() 2、建立Socket3、設(shè)置服務(wù)器地址及端口號4、發(fā)送及接收信息5、結(jié)束 socket 連接 相應(yīng)的程序:/* client.c *#include <stdio.h>#include <Winsock2.h> /WINSOCK API的頭文件,需要包含在項目中#pragma comment(lib, "ws2_32.lib") /WINSOCK API連接庫文件#include <string.h>const int bufferlen=1024;void main() WORD wVersionRe
27、quested; WSADATA wsaData; /WSAata用來存儲系統(tǒng)傳回的關(guān)于WinSocket的資料。 int err;int len;SOCKET sockClient; /用于服務(wù)器監(jiān)聽的SocketSOCKADDR_IN addrSrv; /服務(wù)器地址char recvBufbufferlen; /接受緩存char sendBufbufferlen; /發(fā)送緩存char serverip20; /* 初始化階段 * wVersionRequested = MAKEWORD( 1, 1 ); /WinSocket1.1版本 err = WSAStartup( wVersionR
28、equested, &wsaData ); /wsaData用來存儲系統(tǒng)傳回的關(guān)于WinSocket的資料 if ( err != 0 )return; if ( LOBYTE( wsaData.wVersion ) != 1 |HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return; /* 建立socket、發(fā)送、接受消息 * sockClient=socket(AF_INET,SOCK_DGRAM,0);/ AF_INET .udp連接printf("input server IP:"); scanf(&q
29、uot;%s",serverip); /輸入服務(wù)器ip addrSrv.sin_addr.S_un.S_addr=inet_addr(serverip); /設(shè)置服務(wù)器地址 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); / 設(shè)置端口號memset(recvBuf,0,sizeof(recvBuf); /初始化接收緩沖區(qū)len=sizeof(SOCKADDR_IN); /Socket的地址值的長度 printf("-n"); while(1)printf("client:");
30、scanf("%s",sendBuf); /輸入服務(wù)器要發(fā)送的消息,或者輸入exit可斷開連接if(strcmp(sendBuf,"exit")=0) /當客戶端要斷開連接時,給服務(wù)器發(fā)送exit,跳出循環(huán)sendto(sockClient,"exit",5,0,(SOCKADDR *)&addrSrv,len);printf("-The session is terminated!-n");break;sendto(sockClient,sendBuf,sizeof(sendBuf)+1,0,(SOCKADDR *)&addrSrv,len); /發(fā)送消息recvfrom(sockClient,recvBuf,bufferlen,0,(SOCKADDR *)&addrSrv
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高效沼氣脫硫設(shè)備項目建議書
- 體育木地板建設(shè)合同范例
- 產(chǎn)業(yè)扶貧幫扶合同范例
- 供酒店食品合同范例
- 與購房中介合同范例
- 個人增資入股合同范本
- 基于不平衡數(shù)據(jù)的茄子病害分類
- 產(chǎn)品開發(fā)協(xié)議合同范例
- 冰庫買賣合同范例
- 個人終止房屋買賣合同范例
- 2024低溫液化氣體氣瓶充裝站安全技術(shù)條件
- 醫(yī)院內(nèi)控評價工作報告
- 2021年10月自考00150金融理論與實務(wù)試題及答案含解析
- 智慧化除塵器及控制系統(tǒng)解決方案
- 急診預(yù)檢分診培訓(xùn)
- 建筑垃圾商業(yè)計劃書
- 2024年蘭州市高三診斷考試(一診)地理試卷(含答案)
- 小學(xué)中高年級語文整本書閱讀教學(xué)策略
- 2024年青島版數(shù)學(xué)五年級下冊第一單元、第二單元測試題及答案(各一套)
- 自行車的力學(xué)知識研究報告
- 《高危藥品管理》課件
評論
0/150
提交評論