利用流式套接字实现文件的传输_第1页
利用流式套接字实现文件的传输_第2页
利用流式套接字实现文件的传输_第3页
利用流式套接字实现文件的传输_第4页
利用流式套接字实现文件的传输_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、网络编程技术实验报告实验名称实验四利用流式套接字传输文件实验队别姓名学号实验日期2015.12.11实验报告要求:1.实验目的2.实验要求3.实验环境4.实验作业5.问题及解决6.思考问题7.实验体会【实验目的】1 .掌握定长与变长流式套接字的使用方法2 .加深对流式套接字的掌握3 .掌些解决实际问题的能力【实验要求】客户端向服务器发起socket连接,并建立数据传输通道客户端向服务器发送要传输的文件名称,以"#"字符结尾,服务器逐字接收,直到接收到#(变长数据)客户端向服务器发送文件长度,4字节(定长数据)工户端向服务器文件内容(变长数据)报务端接收完文件后,向客户端发送

2、ok,以示成功接收客户端接收到OKB,关闭套接字报务器关闭套接字【实验环境】Devc【实验作业】客户端:nttcp_client_fun_echo(FILE*fp,SOCKETs)intiResult;charsendlineMAXLINE,recvlineMAXLINE;charfile20;charflong4;inti=0;/文件名发送控制/初始化缓冲区FILE*f;/写文件指针char*buff;/读入文件内容uint32_tnFileLen;/文1£度printf("请输入文件名:n");scanf("%s",&file);f

3、=fopen(file,"rb");if(f=NULL)printf("打开文件失败或文件不存在!n");fseek(f,0,SEEK_END);nFileLen=ftell;rewind;回到到文件头部buff=(char*)malloc(nFileLen);iResult=fread(buff,1,nFileLen,f);if(iResult!=nFileLen)printf("读入文件错误!n");return0;memset(sendline,0,MAXLINE);memset(recvline,0,MAXLINE);whil

4、e(i!=nFileLen)recvlinei=*buff;i+;buff+;/文件名传输结束sprintf(sendline,"%s#%d%s",file,nFileLen,recvline);%d",WSAGetLastError();iResult=send(s,sendline,sizeof(sendline),0);if(iResult=SOCKET_ERROR)printf("send函数调用错误,错误号:return-1;fclose(fp);printf("文件发送完成!n");returniResult;1报务器:n

5、ttcp_server_fun_echo(SOCKETs)1FILE*fp;inti=0;charflong4;intiResult=0;uint32_tnFileLen=1;charrecvlineMAXLINE;charfile10;memset(file,0,sizeof(file);memset(recvline,0,sizeof(recvline);for(;)iResult=recv(s,&filei,1,0);if(iResult=SOCKET_ERROR)printf("recv函数调用错误,错误号:d",WSAGetLastError();retu

6、rn-1;if(filei='#')break;elsei+;filei='0'fp=fopen(file,"w+");if(fp=NULL)printf("文件打开失败!");/接收文件长度iResult=recv(s,flong,4,0);if(iResult=SOCKET_ERROR)printf("recv函数调用错误,错误号:d",WSAGetLastError();return-1;sscanf(flong,"%d",&nFileLen);Result=recv(

7、s,recvline,nFileLen,0);if(iResult=SOCKET_ERROR)printf("recv函数调用错误,错误号:d",WSAGetLastError();return-1;fputs(recvline,fp);fclose(fp);printf("文件接收成功!n");returniResult;1头文件(上次的实验报告中已经写过):#ifndefp_h预处理指令,防止重复包含头文件#include<stdio.h>#include<time.h>#include<ws2tcpip.h>#i

8、nclude<winsock2.h>#include<windows.h>#pragmacoment(lib,"ws2_32.lib")usingnamespacestd;classCSocketFramepublic:intstart_up();intclean_up();intset_address(char*hname,char*sname,structsockaddr_in*sap,char*protocol);intquit(SOCKETs);SOCKETtcp_server(ULONGuIP,USHORTuPort);SOCKETtcp_

9、server(char*hname,char*sname);SOCKETtcp_client(char*hname,char*sname);SOCKETtcp_client(ULONGuIP,USHORTuPort);ntCSocketFrame:start_up(void)WORDwVersionRequested;WSADATAwsaData;intiResult;wVersionRequested=MAKEWORD(2,2);iResult=WSAStartup(wVersionRequested,&wsaData);if(iResult!=0)(printf("WSA

10、Startup调用错误,错误号:dn",WSAGetLastError();return-1;)/*if(LOBYTE(wsaData.wVersion!=2|HIBYTE(wsaData.wVersion)!=2)(printf("无法找到可用的WS诙本n");WSACleanup();return-1;/告诉用户无法找到可用的WSD)else(printf("WS2.2初始化成功!n");*/return0;ntCSocketFrame:clean_up(void)intiResult;iResult=WSACleanup();if(iRe

11、sult=SOCKET_ERROR)/WSACleanup()调用失败printf("WSACleanup调用错误,错误号:dn",WSAGetLastError();return-1;elseprintf("Winsocketdll释放成功!n");return0;1ntCSocketFrame:set_address(char*hname,char*sname,structsockaddr_in*sap,char*protocol)1structservent*sp;structhostent*hp;char*endptr;unsignedshort

12、port;unsignedlongulAddr=INADDR_NONE;/将地址结构socketsddr_in初始化为0,并将地址族设为AF_INETmemset(sap,0,sizeof(*sap);sap->sin_family=AF_INET;if(hname!=NULL)/如果hname不为空,转化地址格式ulAddr=inet_addr(hname);if(ulAddr=INADDR_NONE|ulAddr=INADDR_ANY)/调用错误,调用gethostbyname获得主机地址hp=gethostbyname(hname);if(hp=NULL)printf("

13、未知的主机名,错误号:dn",WSAGetLastError();return-1;sap->sin_addr=*(structin_addr*)hp->h_addr;elsesap->sin_addr.S_un.S_addr=ulAddr;else/如果调用者没有指明一个主机名或地址,则设为通配地址sap->sin_addr.s_addr=htonl(INADDR_ANY);/尝试转换sname为一个整数port=(unsignedshort)strtol(sname,&endptr,0);if(*endptr='0')/如果成功转化

14、为网络字节序sap->sin_port=htons(port);else/如果失败,则假定是一个服务名称,通过getservbyname()函数获得端口号sp=getservbyname(sname,protocol);if(sp=NULL)printf("未知服务,错误号:dn",WSAGetLastError();return-1;sap->sin_port=sp->s_port;return0;1ntCSocketFrame:quit(SOCKETs)1intiResult=0;iResult=closesocket(s);if(iResult=SO

15、CKET_ERROR)printf("closesocket调用错误,错误号:dn",WSAGetLastError();return-1;iResult=clean_up();returniResult;1SOCKETCSocketFrame:tcp_server(char*hname,char*sname)1SOCKETListenSocket;intiResult=0;sockaddr_inlocal;constinton=1;/为服务器的本机地址设置用户输入的地址以及端口号if(set_address(hname,sname,&local,(char*)&q

16、uot;tcp")!=0)return-1;/创建套接字ListenSocket=socket(AF_INET,SOCK_STREAM,0);if(ListenSocket=INVALID_SOCKET)printf("socket函数调用错误,错误号:dn",WSAGetLastError();WSACleanup();return-1;/绑定服务器地址iResult=bind(ListenSocket,(structsockaddr*)&local,sizeof(local);if(iResult=-1)printf("bind函数调用错误!

17、错误号:dn",WSAGetLastError();closesocket(ListenSocket);WSACleanup();return-1;/设置函数为监听状态,监听队列长度为NLISTENiResult=listen(ListenSocket,SOMAXCONN);if(iResult=SOCKET_ERROR)printf("Listen函数调用错误!错误号:dn",WSAGetLastError();quit(ListenSocket);return-1;returnListenSocket;1SOCKETCSocketFrame:tcp_serve

18、r(ULONGuIP,USHORTuPort)1SOCKETListenSocket=INVALID_SOCKET;intiResult=0;sockaddr_inlocal;constinton=1;/为服务器的本机地址设置用户输入的地址以及端口号memset(&local,0,sizeof(local);local.sin_family=AF_INET;local.sin_addr.S_un.S_addr=htonl(uIP);local.sin_port=htons(uPort);ListenSocket=socket(AF_INET,SOCK_STREAM,0);if(List

19、enSocket=INVALID_SOCKET)printf("socket函数调用错误,错误号:dn",WSAGetLastError();clean_up();return-1;/绑定服务器地址iResult=bind(ListenSocket,(structsockaddr*)&local,sizeof(local);if(iResult=SOCKET_ERROR)printf("bind函数调用错误!错误号:dn",WSAGetLastError();quit(ListenSocket);return-1;/设置函数为监听状态,监听队列长

20、度为NLISTENiResult=listen(ListenSocket,SOMAXCONN);if(iResult=SOCKET_ERROR)printf("Listen函数调用错误!错误号:dn",WSAGetLastError();quit(ListenSocket);return-1;returnListenSocket;1SOCKETCSocketFrame:tcp_client(char*hname,char*sname)1intiResult=0;structsockaddr_inpeer;SOCKETClientSocket;/为服务器的地址peer设置用户

21、输入的地址以及端口号if(set_address(hname,sname,&peer,(char*)"tcp")!=0)return-1;/创建套接字ClientSocket=socket(AF_INET,SOCK_STREAM,0);if(ClientSocket=INVALID_SOCKET)printf("socket函数调用错误,错误号:dn",WSAGetLastError();clean_up();return-1;/请求建立连接iResult=connect(ClientSocket,(structsockaddr*)&pe

22、er,sizeof(peer);if(iResult=SOCKET_ERROR)printf("connect函数调用错误!错误号:dn",WSAGetLastError();quit(ClientSocket);return-1;returnClientSocket;1SOCKETCSocketFrame:tcp_client(ULONGuIP,USHORTuPort)1intiResult=0;structsockaddr_inpeer;SOCKETClientSocket;/为服务器的地址peer设置用户输入的地址以及端口号memset(&peer,0,sizeof(peer);peer.sin_family=AF_INET;peer.sin_addr.S_un.S_addr=htonl(uIP);peer.sin_port=htons(uPort);/创建套接字ClientSocket=socket(AF_INET,SOCK_STREAM,0);if(ClientSocket=INVALID_SOCKET)printf("socket函数调用错误,错误号:dn",WSAG

温馨提示

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

最新文档

评论

0/150

提交评论