


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、實驗報告實驗名稱-SOCKET編程一、實驗?zāi)康?1) 加深對TCP和UDP的理解;(2) 實現(xiàn)兩臺計算機之間TCP/UDP通信。二、實驗過程原理:socket是在應(yīng)用層和傳輸層之間的一個抽象層,它把TCP/IP層復(fù)雜的操作抽象為幾個簡單的接口供應(yīng)用層調(diào)用以實現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。如下圖所示:應(yīng)用層剛絡(luò)層鏈路層serverclient創(chuàng) socket連接指定計算機的端口向socket中寫入信息關(guān)閉socketTCP通信原理如圖:創(chuàng)建socket綁定socketSd端口號監(jiān)聽該端口號接收未自客戶端的 逹接請求從socket中讀取字符關(guān)閉socket代碼:服務(wù)器端:#pragma comme nt(l
2、ib, "WS2_32.lib")#include<Winsock2.h>#include<iostream>#include<stdlib.h> using namespace std;int main()int i=0;WSADATA wsaData;SOCKET oldSocket,newSocket;/ 客戶 地址長度int iLen=0;/ 發(fā)送的 數(shù)據(jù)長度int iSend=0;/ 接收的 數(shù)據(jù) 長度int ircv =0;/ 處世要 發(fā)送給客 戶的信息char buf20="I am a server"/
3、 接收來自用戶的信息char fromcli512;/ 客戶 和服務(wù)器的 SOCKET 地址結(jié)構(gòu)struct sockaddr_in ser,cli; if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)cout<<"failed to load winsock"<<endl; return 0;cout<<"server waiting"<<endl; cout<<""<<endl;/ 創(chuàng)建服務(wù)器端幀聽 SOCKET old
4、Socket=socket(AF_INET,SOCK_STREAM,0); if(oldSocket=INVALID_SOCKET)cout<<"socket() failed:"<<WSAGetLastError()<<endl; return 0;/ 以下是建立服 務(wù)器端的 SOCKET 地址 結(jié)構(gòu) ser.sin_family=AF_INET;ser.sin_port=htons(5050);/ 使用系 統(tǒng)指定的 ip 地址 INADDR_ANY/ ser.sin_addr.s_addr=htonl(INADDR_ANY); ser
5、.sin_addr.s_addr= inet_addr("8");if(bind(oldSocket,(LPSOCKADDR)&ser,sizeof(ser)=SOCKET_ERROR) cout<<"bind() failed:"<<WSAGetLastError()<<endl; return 0;/ 進(jìn)入偵聽 狀態(tài) if(listen(oldSocket,5)=SOCKET_ERROR)cout<<"listen() failed:"<<W
6、SAGetLastError()<<endl; return 0;/ 接收客 戶端的 連接 iLen=sizeof(cli);newSocket=accept(oldSocket,(struct sockaddr*)&cli,&iLen);/ 新的 SOCKETif(newSocket=INVALID_SOCKET)cout<<"accept() failed:"<<WSAGetLastError()<<endl;/ return 0;/ 進(jìn)入一個無限循環(huán),等待客 戶發(fā)送數(shù)據(jù)while(1)i+;/ 服 務(wù)器初
7、始化接收 緩沖區(qū) memset(fromcli,0,512); ircv=recv(newSocket,fromcli,sizeof(fromcli),0); if(ircv=SOCKET_ERROR)cout<<"rcv() failed:"<<WSAGetLastError()<<endl; break;else if(ircv=0) break;else cout<<" 服 務(wù)器接收的 內(nèi) 容為"<<fromcli<<endl; if(strcmp(fromcli,"
8、quit")=0) break; closesocket(newSocket); closesocket(oldSocket); WSACleanup();客戶端:#pragma comment(lib, "WS2_32.lib")#include<winsock2.h>#include<iostream>#include<stdio.h> using namespace std;#define DATA_BUFFER 512int main()WSADATA wsaData;SOCKET sClient;char ch;int
9、 i=0;char *Serip="8"/隨著程序所在主機的地址改 變而改 變int SeriPort=5050;/ 從服務(wù)器接收的 數(shù)據(jù)的長度int iLen;/ 發(fā)送的 數(shù)據(jù)長度int isnd;/ 接收 緩沖區(qū)char bufDATA_BUFFER;/ 發(fā)送 緩沖區(qū)char sndbufDATA_BUFFER;/ 服務(wù)器端 SOCKET 地址 結(jié)構(gòu) struct sockaddr_in ser;/ 接收 /發(fā)送緩沖區(qū)的初始化 memset(buf,0,sizeof(buf);memset(sndbuf,0,DATA_BUFFER); if(WSA
10、Startup(MAKEWORD(2,2),&wsaData)!=0)cout<<"failed to load winsock"<<endl; return 0;/ 填寫要連接的服 務(wù)器地址信息 ser.sin_family=AF_INET;ser.sin_port=htons(SeriPort); ser.sin_addr.s_addr=inet_addr(Serip);/ 建立客 戶端字節(jié)流式套接字 sClient=socket(AF_INET,SOCK_STREAM,0); if(sClient=INVALID_SOCKET)cout
11、<<"socket() failed :"<<WSAGetLastError()<<endl; return 0;/ 請求 與服務(wù) 器建立 連接/ cout<<"set link"sockaddrif(connect(sClient,(struct *)&ser,sizeof(ser)=INVALID_SOCKET)cout<<"connect() failed: "<<WSAGetLastError()<<endl; return 0;els
12、e/ 向服務(wù)器端 發(fā)送數(shù)據(jù)while(1) cout<<endl; i+; cout<<" 第 "<<i<<" 發(fā)送 "<<endl; cin>>sndbuf; isnd=send(sClient,sndbuf,sizeof(sndbuf),0); if(isnd=0) return 0;else if(isnd=SOCKET_ERROR)cout<<"send() failed:"<<WSAGetLastError()<<en
13、dl; return 0;cout<<" 客戶端發(fā) 送 內(nèi)容為 "<<sndbuf<<endl; closesocket(sClient); WSACleanup();本機上客戶端與服務(wù)器端通信結(jié)果如圖:qwei't yuiop she>isa girl蟲兇里灣戶端發(fā)送內(nèi)容為一M劭發(fā)送wertyuiop-客戶端發(fā)進(jìn)內(nèi)容為L(jwei*t uiopEUkCToHteruer wait in STp遊尋戶端發(fā)送內(nèi)容為一一i=R-l戶端發(fā)送內(nèi)容為一一apybE-tl 艮I?送tl£J KrucrzlDrzlDrfparl
14、lp 務(wù)務(wù)務(wù)務(wù)務(wù) 陽r戎n.gEr-E筋發(fā)送she 話 a irlh一-客戶端發(fā)迭內(nèi)容為n r -Ji -UTJJ-為為為為為n#在兩臺服務(wù)器上分別運行服務(wù)器端和客戶端,結(jié)果如圖:江 CDOCUIEnADBIirilXLOCALSlXTcBpVRarjEKl 1.8094X1務(wù)器話恥1)11就udp實蓋Die 11d , I am a client.Sepuer rece iued. f pom Client ip: 127.0_0.13, port: 2604 J12一一Seruer received From Client ip:Ppoikt: 260434一一Server receiMe
15、d from Client xp:127.port:T26B4一Server received from Client ip:12?,0.Q»1JFport:(260UDP通 信原理如圖:UDP般務(wù)器瑞11.”socket()1b.nd() Jrecvfrorrf)7阻塞直到接收:到客戶數(shù)據(jù)<9I處理客:戶數(shù)據(jù)數(shù)據(jù)應(yīng)答UDP戸帝1close() 廿1socket()3r嗎sendtof)JFrecvfron()r-close()*代碼:服務(wù)器端:#i nclude "stdafx.h"#i nclude vwin sock2.h>#in elude &
16、lt;stdio.h>#in elude <stdlib.h>#defi ne buffer_le ngth 512#pragma comme nt(lib, "WS2_32.lib") void mai n()WSADATA wsadata;SOCKET sSocket;in t ile n;int irecv;char recv_bufbuffer_le ngth;char sen d_bufbuffer_le ngth;/服務(wù)器和客戶SOCKET地址結(jié)構(gòu)struct sockaddr_ in seradd,cliadd;if(WSAStartup(M
17、AKEWORD(2,2), &wsadata)!=0) prin tf("failed to load win socketn");return; sSocket=socket(AF_INET,SOCK_DGRAM,0); if(sSocket=INVALID_SOCKET)printf("socket() failed:%dn",WSAGetLastError(); return;/ 初始化服 務(wù)器 SOCKET 地址 結(jié)構(gòu) seradd.sin_family=AF_INET; seradd.sin_port=htons(6666); /ser
18、add.sin_addr.s_addr=htonl(INADDR_ANY); seradd.sin_addr.s_addr= inet_addr("");if(bind(sSocket,(LPSOCKADDR)&seradd,sizeof(seradd)=SOCKET_ RROR)printf(” 地址綁定時出錯:dn",WSAGetLastError(); int rua;scanf("%d", &rua); return;ilen=sizeof(cliadd);/ 初始化接收 緩沖區(qū) memset(recv_b
19、uf,0,sizeof(recv_buf);irecv=recvfrom(sSocket,recv_buf,buffer_length,0,(struct sockaddr*)&cliadd,&ilen);if(irecv=SOCKET_ERROR)printf("接收出錯 dn",WSAGetLastError(); int rua;scanf("%d", &rua); return;else if(irecv=0) return;elseClientprintf("n%s-",recv_buf); prin
20、tf("Serverreceivedfromip:%s,port:%dn",inet_ntoa(cliadd.sin_addr),ntohs(cliadd.sin_port);while(1)/ 在此函 數(shù)中 cli 為傳 出 參數(shù)irecv=recvfrom(sSocket,recv_buf,buffer_length,0,(struct sockaddr*)&cliadd,&ilen);if(irecv=SOCKET_ERROR)printf(" 接收出 錯 %dn",WSAGetLastError(); int rua;scanf(
21、"%d", &rua);return;else if(irecv=0)break;elseprintf("n%s-",recv_buf);Clientprintf("Server received from ip:%s,port:%dn",inet_ntoa(cliadd.sin_addr),ntohs(cliadd.sin_port);scanf("%s",send_buf);sendto(sSocket,send_buf,sizeof(send_buf),0,(struct sockaddr*)&
22、;cliadd,sizeof(cliadd);closesocket(sSocket); WSACleanup();客戶端:#include "stdafx.h"#include<winsock2.h>#include <stdio.h>#define data_buffer1024void main()WSADATA wsadata;SOCKET sclient;/ 服務(wù) 器地址、端口 號char * serip="8"int Seriport=6666;char ch="qita"/
23、服務(wù)器 SOCKET 地址結(jié)構(gòu)長 度int ilen;/ 發(fā)送/ 接收數(shù)據(jù)大小int isend;int irecv;/ 要發(fā)送給服務(wù)器的 數(shù)據(jù)char send_buf="hello,I am a client."char recv_bufdata_buffer;/ 服務(wù)器端的 SOCKET 地址 結(jié)構(gòu) struct sockaddr_in seradd, cliadd;/ 初始化接收 緩沖 區(qū) memset(recv_buf,0,sizeof(recv_buf);/ 字符 數(shù)組初始化 memset(ch,0,sizeof(ch); if(WSAStartup(MAKEW
24、ORD(2,2),&wsadata)!=0) printf("failed to load winsockn"); return;/ 服務(wù)器 SOCKET 地址結(jié)構(gòu) 初始化 seradd.sin_family=AF_INET; seradd.sin_port=htons(Seriport); seradd.sin_addr.s_addr=inet_addr(serip);cliadd.sin_family=AF_INET; cliadd.sin_port=htons(7777); cliadd.sin_addr.s_addr=inet_addr("0.0.
25、0.0");sclient=socket(AF_INET,SOCK_DGRAM,0); if(sclient=INVALID_SOCKET) printf("build socket failed!n"); return; if(bind(sclient,(LPSOCKADDR)&cliadd,sizeof(cliadd)=SOCKET_ERROR)printf(” 地址綁定時出錯:dn",WSAGetLastError(); return;/ 無連接不需要 進(jìn)行地址 與套接字的 綁定,直接 發(fā)送數(shù)據(jù)即可 ilen=sizeof(seradd);
26、isend=sendto(sclient,send_buf,sizeof(send_buf),0,(structsockaddr*)&seradd,ilen);if(isend!=0&&isend!=SOCKET_ERROR)/printf("data has been sent successfully!n"); printf("客戶所發(fā)的數(shù)據(jù)為:%s,字節(jié)數(shù)為:%dn",send_buf,isend);else retur n;while(1)scan f("%s",ch);sen dto(sclie nt
27、,ch,sizeof(ch),0,(structsockaddr* )& seradd,sizeof(seradd);irecv=recvfrom(sclie nt,recv_buf,data_buffer,O,(struct sockaddr* )& seradd,&i le n);if(irecv=SOCKET_ERROR)printf("接收出錯%dn",WSAGetLastError();in t rua;scanf("%d", &rua);return;else if(irecv=0)break;elseClie
28、 ntprin tf("n%s-",recv_buf);prin tf("Serverreceivedfromip:%s,port:%dn",i net_n toa(seradd.s in _addr) ,n tohs(seradd.s in _port);closesocket(sclie nt);WSAClea nup();本機上客戶端與服務(wù)器端通信結(jié)果如圖:珈F:計算機網(wǎng)貉實耋Vidp實翼程序11 - EXPMidp實醴程序- EIPI客戶aSDebue®戶 目回X尊戶所發(fā)的藪據(jù)為i hello,I am a client.,字節(jié)數(shù)為:21123*C* F八計算機兩谿實鑿11即實豔程序li - EKPludp憲雅程JT -4S3Shebugudp. . . QB3hellu, I an a client.一一Server receiued f ron Client Ipt.1192J,port: 7777123一一Seruer
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工獎金合同協(xié)議書
- 合伙生意結(jié)算協(xié)議書
- 商鋪裝修施工協(xié)議書
- 叉車事故賠償協(xié)議書
- 醫(yī)療健康行業(yè)的遠(yuǎn)程醫(yī)療服務(wù)與數(shù)字工具應(yīng)用
- 在線醫(yī)學(xué)實驗平臺的開發(fā)與實施經(jīng)驗分享
- 地板保潔承包協(xié)議書
- 2025年鄉(xiāng)村旅游特色項目人力資源配置與培訓(xùn)研究報告
- 企業(yè)內(nèi)部數(shù)字資源的管理及與ROI相關(guān)的效益研究
- 社會倫理與經(jīng)濟行為的關(guān)系試題及答案
- 醫(yī)療機構(gòu)信息化成本控制方案
- 定金購車合同書
- 【基于單片機的智能送餐配送車設(shè)計與實現(xiàn)(論文)11000字】
- 人工智能通識教程 第2版 課件全套 周蘇 第1-15章 思考的工具- 人工智能發(fā)展
- 人教部編版七年級語文上冊《散步》示范課教學(xué)課件
- 環(huán)衛(wèi)承包協(xié)議
- 運輸企業(yè)安全生產(chǎn)責(zé)任制制度
- 醫(yī)院護(hù)理培訓(xùn)課件:《安全注射》
- 醫(yī)療器械勞動合同范本
- 數(shù)字華容道-1課時
- 2024-2029年中國醇類燃料行業(yè)深度調(diào)研及投資前景預(yù)測研究報告
評論
0/150
提交評論