利用流式套接字实现文件的传输

上传人:枫** 文档编号:489044185 上传时间:2024-02-04 格式:DOCX 页数:10 大小:32.73KB
返回 下载 相关 举报
利用流式套接字实现文件的传输_第1页
第1页 / 共10页
利用流式套接字实现文件的传输_第2页
第2页 / 共10页
利用流式套接字实现文件的传输_第3页
第3页 / 共10页
利用流式套接字实现文件的传输_第4页
第4页 / 共10页
利用流式套接字实现文件的传输_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《利用流式套接字实现文件的传输》由会员分享,可在线阅读,更多相关《利用流式套接字实现文件的传输(10页珍藏版)》请在金锄头文库上搜索。

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

2、接收到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=fopen(file,rb);if(f=NULL)printf(打开文件失败或文件不存在!

3、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);while(i!=nFileLen)recvlinei=*buff;i+;buff+;/文件名传输结束sprintf(sendline,%s#%d%s,file,nFile

4、Len,recvline);%d,WSAGetLastError();iResult=send(s,sendline,sizeof(sendline),0);if(iResult=SOCKET_ERROR)printf(send函数调用错误,错误号:return-1;fclose(fp);printf(文件发送完成!n);returniResult;1报务器:nttcp_server_fun_echo(SOCKETs)1FILE*fp;inti=0;charflong4;intiResult=0;uint32_tnFileLen=1;charrecvlineMAXLINE;charfile10

5、;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();return-1;if(filei=#)break;elsei+;filei=0;fp=fopen(file,w+);if(fp=NULL)printf(文件打开失败!);/接收文件长度iResult=recv(s,flong,4,0);if(iResult=SOCKET_E

6、RROR)printf(recv函数调用错误,错误号:d,WSAGetLastError();return-1;sscanf(flong,%d,&nFileLen);Result=recv(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预处理指令,防止重复包含头文件#i

7、nclude#include#include#include#include#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_server(char*hname,char*

8、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(WSAStartup调用错误,错误号:dn,WSAGetLastErro

9、r();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(iResult=SOCKET_ERROR)/WSACleanup()调用失败printf(WSACleanup调用错误,错误号:dn

10、,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;unsignedshortport;unsignedlongulAddr=INADDR_NONE;/将地址结构socketsddr_in初始化为0,并将地址族设为AF_INETmemset(sap,0

11、,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(未知的主机名,错误号:dn,WSAGetLastError();return-1;sap-sin_addr=*(structin_addr*)hp-h_addr;elsesap-sin_addr

12、.S_un.S_addr=ulAddr;else/如果调用者没有指明一个主机名或地址,则设为通配地址sap-sin_addr.s_addr=htonl(INADDR_ANY);/尝试转换sname为一个整数port=(unsignedshort)strtol(sname,&endptr,0);if(*endptr=0)/如果成功转化为网络字节序sap-sin_port=htons(port);else/如果失败,则假定是一个服务名称,通过getservbyname()函数获得端口号sp=getservbyname(sname,protocol);if(sp=NULL)printf(未知服务,错

13、误号:dn,WSAGetLastError();return-1;sap-sin_port=sp-s_port;return0;1ntCSocketFrame:quit(SOCKETs)1intiResult=0;iResult=closesocket(s);if(iResult=SOCKET_ERROR)printf(closesocket调用错误,错误号:dn,WSAGetLastError();return-1;iResult=clean_up();returniResult;1SOCKETCSocketFrame:tcp_server(char*hname,char*sname)1SO

14、CKETListenSocket;intiResult=0;sockaddr_inlocal;constinton=1;/为服务器的本机地址设置用户输入的地址以及端口号if(set_address(hname,sname,&local,(char*)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)

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 营销创新

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号