西工大计算机网络实验三_第1页
西工大计算机网络实验三_第2页
西工大计算机网络实验三_第3页
西工大计算机网络实验三_第4页
西工大计算机网络实验三_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论