




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、,.实 验 报 告实验名称-socket编程一、实验目的(1)加深对 tcp和 udp的理解;(2)实现两台计算机之间tcp/udp通信。二、实验过程原理:socket 是在应用层和传输层之间的一个抽象层,它把 tcp/ip层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。如下图所示:;.,.tcp通信原理如图:代码:服务器端:#pragma comment(lib, ws2_32.lib);.,.#include#include#includeusing namespace std;int main()int i=0;wsadata wsadata;socket oldso
2、cket,newsocket;/ 客户地址长度int ilen=0;/ 发送的数据长度int isend=0;/ 接收的 数据长度int ircv =0;/ 处世要发送给客户的信息char buf20=i am a server;/ 接收来自用户的信息char fromcli512;/ 客户和服务器的 socket 地址结构struct sockaddr_in ser,cli;if(wsastartup(makeword(2,2),&wsadata)!=0)coutfailed to load winsockendl;return 0;coutserver waitingendl;cout-e
3、ndl;/ 创建服务器端帧听 socket oldsocket=socket(af_inet,sock_stream,0); if(oldsocket=invalid_socket)coutsocket() failed:wsagetlasterror()endl; return 0;/ 以下是建立服 务器端的 socket 地址结构ser.sin_family=af_inet;ser.sin_port=htons(5050);/ 使用系 统指定的 ip 地址 inaddr_any/ ser.sin_addr.s_addr=htonl(inaddr_any); ser.sin_addr.s_a
4、ddr= inet_addr(8);if(bind(oldsocket,(lpsockaddr)&ser,sizeof(ser)=socket_error);.,.coutbind() failed:wsagetlasterror()endl;return 0;/ 进入侦听状态if(listen(oldsocket,5)=socket_error)coutlisten() failed:wsagetlasterror()endl;return 0;/ 接收客 户端的连接ilen=sizeof(cli);newsocket=accept(oldsocket,(struct
5、sockaddr*)&cli,&ilen);/ 产生一个新的 socketif(newsocket=invalid_socket)coutaccept() failed:wsagetlasterror()endl;/return 0;/ 进入一个无限循环,等待客 户发送数据while(1)i+;/ 服务器初始化接收 缓冲区memset(fromcli,0,512);ircv=recv(newsocket,fromcli,sizeof(fromcli),0);if(ircv=socket_error)coutrcv() failed:wsagetlasterror()endl;break;els
6、e if(ircv=0)break;else cout-服务器接收的 内容为-fromcliendl;if(strcmp(fromcli,quit)=0)break;closesocket(newsocket);closesocket(oldsocket);wsacleanup();客户端:;.,.#pragma comment(lib, ws2_32.lib)#include#include#includeusing namespace std;#define data_buffer512int main()wsadata wsadata;socket sclient;char ch;int
7、 i=0;char *serip=8;/ 随着程序所在主机的地址改 变而改变 int seriport=5050;/ 从服务器接收的 数据的长度int ilen;/ 发送的数据长度int isnd;/ 接收缓冲区char bufdata_buffer;/ 发送缓冲区char sndbufdata_buffer;/ 服务器端 socket 地址结构struct sockaddr_in ser;/ 接收 / 发送缓冲区的初始化memset(buf,0,sizeof(buf);memset(sndbuf,0,data_buffer);if(wsastartup(makeword
8、(2,2),&wsadata)!=0)coutfailed to load winsockendl;return 0;/ 填写要连接的服务器地址信息ser.sin_family=af_inet;ser.sin_port=htons(seriport);ser.sin_addr.s_addr=inet_addr(serip);/ 建立客户端字节流式套接字sclient=socket(af_inet,sock_stream,0);if(sclient=invalid_socket)coutsocket() failed :wsagetlasterror()endl;return 0;.,./ 请求
9、与服务器建立连接/ coutset link;if(connect(sclient,(struct sockaddr *)&ser,sizeof(ser)=invalid_socket)coutconnect() failed: wsagetlasterror()endl;return 0;else/ 向服务器端发送数据while(1)coutendl;i+;cout 第i 发送sndbuf;isnd=send(sclient,sndbuf,sizeof(sndbuf),0);if(isnd=0)return 0;else if(isnd=socket_error)coutsend() fai
10、led:wsagetlasterror()endl;return 0;cout-客户端发送内容为-sndbufendl;closesocket(sclient);wsacleanup();本机上客户端与服务器端通信结果如图:;.,.在两台服务器上分别运行服务器端和客户端,结果如图:udp通信;.,.原理如图:代码:服务器端:#include stdafx.h#include #include #include #define buffer_length 512#pragma comment(lib, ws2_32.lib)void main()wsadata wsadata;socket ss
11、ocket;int ilen;int irecv;char recv_bufbuffer_length;char send_bufbuffer_length;/ 服务器和客户 socket 地址结构struct sockaddr_in seradd,cliadd;if(wsastartup(makeword(2,2),&wsadata)!=0)printf(failed to load winsocketn);.,.return;ssocket=socket(af_inet,sock_dgram,0);if(ssocket=invalid_socket)printf(socket() fail
12、ed:%dn,wsagetlasterror();return;/ 初始化服 务器 socket 地址结构seradd.sin_family=af_inet;seradd.sin_port=htons(6666);/seradd.sin_addr.s_addr=htonl(inaddr_any);seradd.sin_addr.s_addr= inet_addr();if(bind(ssocket,(lpsockaddr)&seradd,sizeof(seradd)=socket_error)printf( 地址绑定时出错:%dn,wsagetlasterror();int ru
13、a;scanf(%d, &rua);return;ilen=sizeof(cliadd);/ 初始化接收 缓冲区memset(recv_buf,0,sizeof(recv_buf);irecv=recvfrom(ssocket,recv_buf,buffer_length,0,(structsockaddr*)&cliadd,&ilen);if(irecv=socket_error)printf( 接收出错 %dn,wsagetlasterror();int rua;scanf(%d, &rua);return;else if(irecv=0)return;elseprintf(n%s-,re
14、cv_buf);printf(server received from client ip:%s,port:%dn,inet_ntoa(cliadd.sin_addr),ntohs(cliadd.sin_port);while(1);.,./ 在此函 数中 cli 为传出参数irecv=recvfrom(ssocket,recv_buf,buffer_length,0,(structsockaddr*)&cliadd,&ilen);if(irecv=socket_error)printf( 接收出 错%dn,wsagetlasterror();int rua;scanf(%d, &rua);r
15、eturn;else if(irecv=0)break;elseprintf(n%s-,recv_buf);printf(server received from client 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*)&cliadd,sizeof(cliadd);closesocket(ssocket);wsacleanup();客户端:#incl
16、ude stdafx.h#include#include #define data_buffer1024void main()wsadata wsadata;socket sclient;/ 服务器地址、端口 号char * serip=8;intseriport=6666;char ch=qita;/ 服务器 socket 地址结构长 度int ilen;/ 发送 / 接收数据大小int isend;int irecv;.,./ 要发送给服务器的数据char send_buf=hello,i am a client.;char recv_bufdata_buffer;/
17、 服务器端的 socket 地址结构struct sockaddr_in seradd, cliadd;/ 初始化接收 缓冲区memset(recv_buf,0,sizeof(recv_buf);/ 字符数组初始化memset(ch,0,sizeof(ch);if(wsastartup(makeword(2,2),&wsadata)!=0)printf(failed to load winsockn);return;/ 服务器 socket 地址结构初始化seradd.sin_family=af_inet;seradd.sin_port=htons(seriport);seradd.sin_a
18、ddr.s_addr=inet_addr(serip);cliadd.sin_family=af_inet;cliadd.sin_port=htons(7777);cliadd.sin_addr.s_addr=inet_addr();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( 地址绑定
19、时出错:%dn,wsagetlasterror();return;/ 无连接不需要 进行地址 与套接字的 绑定,直接 发送数据即可ilen=sizeof(seradd);isend=sendto(sclient,send_buf,sizeof(send_buf),0,(struct sockaddr *)&seradd,ilen);if(isend!=0&isend!=socket_error)/printf(data has been sent successfully!n);printf( 客户所发的数据为:%s,字节数为:%dn,send_buf,isend);.,.else retur
20、n;while(1)scanf(%s,ch);sendto(sclient,ch,sizeof(ch),0,(structsockaddr*)&seradd,sizeof(seradd);irecv=recvfrom(sclient,recv_buf,data_buffer,0,(structsockaddr*)&seradd,&ilen);if(irecv=socket_error)printf( 接收出 错%dn,wsagetlasterror();int rua;scanf(%d, &rua);return;else if(irecv=0)break;elseprintf(n%s-,recv_buf);printf(server received from client ip:%s,port:%dn,inet_ntoa(seradd.sin_addr),ntohs(seradd.sin_port);clos
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 苏教版数学三年级上册单元测试卷-第五单元-解决问题的策略(含答案)-
- 2025年湖南吉利汽车职业技术学院单招职业技能测试题库及答案一套
- 2025年河南物流职业学院单招职业适应性测试题库汇编
- 2025年河北青年管理干部学院单招职业倾向性测试题库参考答案
- 2024年H-系列卷材涂料项目资金申请报告代可行性研究报告
- 2024年体育公园项目投资申请报告代可行性研究报告
- 2025年河北女子职业技术学院单招职业适应性测试题库一套
- 物理-云南省师范大学附属中学2025届高三下学期开学考试试题和答案
- 第22课《智取生辰纲》教学设计 2024-2025学年统编版语文九年级上册
- 汽车旅馆装修合同解除
- 六年级上册英语教案-Culture 2 Going Green 第二课时 广东开心英语
- 警察叔叔是怎样破案的演示文稿课件
- 青年教师个人成长档案
- 2021译林版高中英语选择性必修三课文翻译
- 2022年华中科技大学博士研究生英语入学考试真题
- 《网店运营与管理》整本书电子教案全套教学教案
- 打印版 《固体物理教程》课后答案王矜奉
- CAD术语对照表
- 香港牛津新魔法Newmagic3AUnit4Mycalendar单元检测试卷
- 中考《红星照耀中国》各篇章练习题及答案(1-12)
- Q∕GDW 11612.43-2018 低压电力线高速载波通信互联互通技术规范 第4-3部分:应用层通信协议
评论
0/150
提交评论