版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)名稱-SOCKET編程一、實(shí)驗(yàn)?zāi)康?1) 加深對(duì)TCP和UDP的理解;(2) 實(shí)現(xiàn)兩臺(tái)計(jì)算機(jī)之間TCP/UDP通信。二、實(shí)驗(yàn)過程原理:socket是在應(yīng)用層和傳輸層之間的一個(gè)抽象層,它把TCP/IP層復(fù)雜的操作抽象為幾個(gè)簡(jiǎn)單的接口供應(yīng)用層調(diào)用以實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。如下圖所示:應(yīng)用層剛絡(luò)層鏈路層serverclient創(chuàng) socket連接指定計(jì)算機(jī)的端口向socket中寫入信息關(guān)閉socketTCP通信原理如圖:創(chuàng)建socket綁定socketSd端口號(hào)監(jiān)聽該端口號(hào)接收未自客戶端的 逹接請(qǐng)求從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)入一個(gè)無限循環(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"/隨著程序所在主機(jī)的地址改 變而改 變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;/ 請(qǐng)求 與服務(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();本機(jī)上客戶端與服務(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#在兩臺(tái)服務(wù)器上分別運(yùn)行服務(wù)器端和客戶端,結(jié)果如圖:江 CDOCUIEnADBIirilXLOCALSlXTcBpVRarjEKl 1.8094X1務(wù)器話恥1)11就udp實(shí)蓋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(” 地址綁定時(shí)出錯(cuò):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("接收出錯(cuò) 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(" 接收出 錯(cuò) %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ù) 器地址、端口 號(hào)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(” 地址綁定時(shí)出錯(cuò):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("接收出錯(cuò)%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();本機(jī)上客戶端與服務(wù)器端通信結(jié)果如圖:珈F:計(jì)算機(jī)網(wǎng)貉實(shí)耋Vidp實(shí)翼程序11 - EXPMidp實(shí)醴程序- EIPI客戶aSDebue®戶 目回X尊戶所發(fā)的藪據(jù)為i hello,I am a client.,字節(jié)數(shù)為:21123*C* F八計(jì)算機(jī)兩谿實(shí)鑿11即實(shí)豔程序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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園防騙防拐演練
- 知榮辱課件教學(xué)課件
- 食品安全與健康相關(guān)
- 退行性脊椎病X線
- 酶促反應(yīng)原理臨床治療
- DB1304T 488-2024大麗花露地栽培技術(shù)規(guī)程
- 聰聰課件 教學(xué)課件
- 高溫燙傷應(yīng)急預(yù)案演練
- 肺全切術(shù)后護(hù)理查房
- 運(yùn)動(dòng)治療儀器及使用方法
- 農(nóng)村環(huán)境長效保潔服務(wù)投標(biāo)方案(技術(shù)方案)
- 【課件】第六單元碳和碳的氧化物+新版教材單元分析-2024-2025學(xué)年九年級(jí)化學(xué)人教版(2024)上冊(cè)
- 廠區(qū)升級(jí)改造項(xiàng)目方案
- 北京能源集團(tuán)有限責(zé)任公司招聘筆試題庫2024
- 人教版高中物理(必修三)同步講義+練習(xí)第十一章 電路及其應(yīng)用(含解析)
- 牛津譯林版英語2024七年級(jí)上冊(cè)全冊(cè)單元知識(shí)清單(默寫版)
- 重癥醫(yī)學(xué)專業(yè)醫(yī)療質(zhì)量控制指標(biāo)(2024年版)學(xué)習(xí)解讀課件
- 2024年軍隊(duì)文職統(tǒng)一考試《專業(yè)科目》管理學(xué)試卷(網(wǎng)友回憶版)含解析
- 2024年全國職業(yè)院校技能大賽中職組(裝配式建筑構(gòu)件安裝賽項(xiàng))考試題庫(含答案)
- 2024年全國職業(yè)院校技能大賽高職組(建筑裝飾數(shù)字化施工賽項(xiàng))備賽試題庫含答
- 2024國機(jī)資本控股限公司招聘高頻考題難、易錯(cuò)點(diǎn)模擬試題(共500題)附帶答案詳解
評(píng)論
0/150
提交評(píng)論