基于CS模式的winsock编程应用_第1页
基于CS模式的winsock编程应用_第2页
基于CS模式的winsock编程应用_第3页
基于CS模式的winsock编程应用_第4页
基于CS模式的winsock编程应用_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、*使用WINSOCK在客户方程序与服务方程序位于两台不同的机器上,在客户方通过指定服务方的IP地址和端口号来通讯。*下列代码仅供参考,同学们可自己参阅相应指导教材进行通信建立,之后可以下载工具软件进行开发。实验代码:#includestdafx.h#includeclient1.h#includecdownload.h#includeMainFrm.h#ifdef_DEBUG#undefTHIS_FILEstaticcharTHIS_FILE=_FILE_;#definenewDEBUG_NEW#endif #defineSERVER_PORT3962#defineSIZE_OF_zmfile

2、1080/关于此宏的定义,见server1项目。/Construction/Destruction/参数是:“可下载文件列表”List控件中当前列表项的索引。cdownload:cdownload(intthno1)m_fname=zm.zip;m_index=-1;doinfo.totle=0;doinfo.threadno=thno1;cdownload:cdownload()intcdownload:sendrequest(intn)/获取服务器信息sockaddr_inlocal;/建套接字SOCKETm_socket;intrc=0;/初使化服务器地址local.sin_family

3、=AF_INET;local.sin_port=htons(SERVER_PORT);m_socket=socket(AF_INET,SOCK_STREAM,0);intret;/联接服务器ret=connect(m_socket,(LPSOCKADDR)&local,sizeof(local);/有错的话if(ret0)AfxMessageBox(联接错误);closesocket(m_socket);return-1;/初使化命令fileinfofileinfo1;fileinfo1.len=n;fileinfo1.seek=50;fileinfo1.type=1;/发送命令intaa=s

4、endn(m_socket,(char*)&fileinfo1,100);if(aa0)closesocket(m_socket);return-1;/接收服务器传来的信息aa=readn(m_socket,(char*)&fileinfo1,100);if(aa0)len2=remanentSIZE?SIZE:remanent;intlen1=readn(m_socket,m_buf,len2);/如果接收数据的时候发生错误,则if(len1=SOCKET_ERROR)closesocket(m_socket);break;destFile.Write(m_buf,len1);/更改要下载的

5、这一段文件的长度,减去已经下载下来了的部分。filerangeindex*2+1-=len1;/前移在文件中seek的位置,也就是把已经下载下来了的那一部分移掉了。filerangeindex*2+=len1;/移动“文件指针”到辅助文件的开头位置。myfile.Seek(0,CFile:begin);/将当前的下载情况写入到辅助文件中,以备以后实现断点续传功能。myfile.Write(&filerangeindex*2,sizeof(int);myfile.Write(&filerangeindex*2+1,sizeof(int);/减去这次循环所读取的数据的长度。remanent=rem

6、anent-len1;/totle字段的含义:要被下载的文件段中,已经下载了的字节数。/对,下载完了一段之后,就需要把新下载的这一段的字节数加上去。doinfo.totle=doinfo.totle+len1;/要下载的文件的片段下载完成了,做收尾工作。myfile.Close();/关闭辅助文件。destFile.Close();/关闭目标文件。deletem_buf;/删除用来从服务器端接收数据的缓冲区。shutdown(m_socket,2);/关闭连接socket。closesocket(m_socket);/addedbyyjk/如果剩余的字节数=0,则if(remanentSend

7、MessageToDescendants(WM_AGE1,(LPARAM)aaa.GetBuffer(0),1);aaa.ReleaseBuffer();/如果文件长度小于0,则返回-1if(doinfo.filelen=0)return-1;/建一个以.down结尾的文件,用来记录文件信息CStringcsTemp;csTemp=m_fname+.down;/保存以.down结尾的文件之名。=csTemp;FILE*fp=NULL;CFilemyfile;if(fp=fopen(csTemp,r)=NULL)/addedbyyjkbegin/看看要下载的文件是否已经存在

8、了,如果是已经存在了,就需要询问一下用户,是否要/重新下载,如果用户选择重新下载,将删除原来的文件。if(fp=fopen(m_fname,r)!=NULL)fclose(fp);/如果用户不想重新下载,就返回2,终止这次下载操作。if(:MessageBox(NULL,同名的文件已经存在了,如果选择“是”将覆盖原来的文件。你是否还要下载此文件?,YJK提醒用户,MB_YESNO|MB_ICONQUESTION)=IDNO)return2;/删除原来的文件,这样,就跟以前从没有下载过此文件一样了。DeleteFile(m_fname);filerange0=0;for(inti=0;i0)/当

9、i=1的时候,filerange2=50;/当i=2的时候,filerange4=100;/当i=3的时候,filerange6=150;filerangei*2=i*(doinfo.filelen/BLOCK+1);/加上1,是为了防止程序在遇到doinfo.filelen/BLOCK=0这种情况的时候,运行出错。filerangei*2=i*(doinfo.filelen/BLOCK);/addedbyyjk/当i=0的时候,filerange1=50;/当i=1的时候,filerange3=50;/当i=2的时候,filerange5=50;/当i=3的时候,filerange7=50;

10、filerangei*2+1=doinfo.filelen/BLOCK+1;/filerangei*2+1=doinfo.filelen/BLOCK;/addedbyyjkmyfile.Open(csTemp,CFile:modeCreate|CFile:modeWrite|CFile:typeBinary);myfile.Write(&doinfo.filelen,sizeof(int);/关闭这个以.down结尾的辅助文件。myfile.Close();CStringtemp;/BLOCK的值为4,那么就是从0至3进行循环了,共循环4次。for(intii=0;iim_work.m_Lis

11、tCtrl-AddItemtwo(n,2,0,0,0,doinfo.threadno);/否则,就说明XX.down文件已经存在了,就说明这次操作应该是(断点)续传,具体的做法就是:/读上次下载的信息,用来接着下载。elsefread(&doinfo.filelen,sizeof(int),1,fp);fclose(fp);/下面的这一段代码好像已经没什么用了,可以去掉了。CStringtemp;csTemp=m_fname+.down0;if(fp=fopen(csTemp,r)=NULL)return1;elsefclose(fp);/此变量用来计算需要下载的总的数据量。intbb;/初始化为0bb=0;/从辅助文件中读取各线程的下载信息,读取的信息存放到filerange数组中。for(intii=0;iim_work.m_ListCtrl-AddItemtwo(n,2

温馨提示

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

评论

0/150

提交评论