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

下载本文档

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

文档简介

精品文档实 验 报 告实验名称-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 oldSocket,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-endl; /创建服务器端帧听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_addr= 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 sockaddr*)&cli,&iLen);/产生一个新的SOCKET if(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; else 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_BUFFER 512int main()WSADATA wsaData;SOCKET sClient;char ch;int 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(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;/请求与服务器建立连接/ 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() failed: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 sSocket;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() failed:%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 rua;scanf(%d, &rua);return; ilen=sizeof(cliadd);/初始化接收缓冲区 memset(recv_buf,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;elseprintf(n%s-,recv_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,(struct sockaddr*)&cliadd,&ilen);if(irecv=SOCKET_ERROR)printf(接收出错%dn,WSAGetLastError();int rua;scanf(%d, &rua);return; else if(irecv=0)break;else printf(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();客户端:#include stdafx.h#include#include #define data_buffer 1024void main()WSADATA wsadata;SOCKET sclient;/服务器地址、端口号char * serip=8;int Seriport=6666;char ch=qita;/服务器SOCKET地址结构长度int ilen;/发送/接收数据大小int isend;int irecv;/要发送给服务器的数据char send_buf=hello,I am a client.;char recv_bufdata_buffer;/服务器端的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_addr.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(地址绑定时出错:%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 return; while(1) scanf(%s,ch);sendto(sclient,ch,sizeof(ch),0,(struct sockaddr*)&seradd,sizeof(seradd);irecv=recvfrom(sclient,recv_buf,data_buffer,0,(struct sockaddr*)&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); closesocket(sclient); WSACleanup();本机上客

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论