一个基于TCP的多线程文件下载模型
2011-12-23 22:12
253 查看
服务端代码:
View Code
View Code
void CFileCilentDlg::OnButton1() { UpdateData(); // TODO: Add your control notification handler code here SOCKET conn; const char* servername="127.0.0.1"; struct hostent *hp; struct sockaddr_in server; unsigned int addr; conn=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(conn==INVALID_SOCKET) { return; } if(inet_addr(servername)==INADDR_NONE) { hp=gethostbyname(servername); } else { addr=inet_addr(servername); hp=gethostbyaddr((char*)&addr,sizeof(addr),AF_INET); } if(hp==NULL) { closesocket(conn); return; } server.sin_addr.s_addr=*((unsigned long*)hp->h_addr); server.sin_family=AF_INET; server.sin_port=htons(20248); if(connect(conn,(struct sockaddr*)&server,sizeof(server))) { closesocket(conn); return; } char buff[512]; int z; z=recv(conn,buff,512,0); buff[z]=0; strcpy(buff,"auth passwd\r\n"); send(conn,buff,strlen(buff),0); z=recv(conn,buff,512,0); buff[z]=0; sprintf(buff,"file %s\r\n",m_fileName); send(conn,buff,strlen(buff),0); CFile f; char *fname; char fname2[256]; if(!(fname=strrchr(m_fileName,'\\'))) strcpy(fname2,m_fileName); else strcpy(fname2,fname+1); int n=m_fileName.ReverseFind('\\'); CString fileName=m_fileName.Right(m_fileName.GetLength()-(n+1)); CString filepath="D:\\"+fileName; MessageBox(filepath); f.Open(filepath,CFile::modeCreate | CFile::modeWrite); bool first=true; bool second=false; while(true) { z=recv(conn,buff,128,0); if(z==SOCKET_ERROR) { MessageBox("\r\n\r\nsocket error socket error socket error\r\n"); break; } if(second) { if(NoFile(buff,128)<128) { MessageBox("File"+m_fileName+" not found on server\r\n"); break; } second=false; } if(first) { if(NoFile(buff,128)<128) { MessageBox("File "+m_fileName+" not found on server\r\n"); break; } first=false; second=true; } int b; if((b=EndFile(buff,z))<z) { f.Write(buff,b); MessageBox(" has been saved.\r\n"); break; } f.Write(buff,z); } f.Close(); shutdown(conn,2); closesocket(conn); } int CFileCilentDlg::EndFile(char *buff, int len) { int pos=len; for(int u=0;u<(len-4);u++) { if(buff[u]=='#') if(buff[u+1]=='F') if(buff[u+2]=='i') if(buff[u+3]=='l') if(buff[u+4]=='e') { pos=u; break; } } return pos; } int CFileCilentDlg::NoFile(char *buff, int len) { int pos=len; for(int u=0;u<(len-4);u++) { if(buff[u]=='!') if(buff[u+1]=='F') if(buff[u+2]=='i') if(buff[u+3]=='l') if(buff[u+4]=='e') { pos=u; break; } } return pos; }
相关文章推荐
- 基于select I/O模型的远程目录浏览与多线程文件下载
- 基于select I/O模型的远程目录浏览与多线程文件下载
- 多线程下载一个文件
- 使用多线程下载同一个文件
- 一个基于Retrofit的单文件上传、下载框架
- 基于Java的一个简单的文件上传下载功能
- 1 多线程下载一个文件(普通的java工程:java实现)
- 基于tcp的c/s模型的一个简单的socket实现
- C#多线程下载一个文件
- 基于TCP网络通信的自动升级程序源码分析-启动升级文件下载程序
- 一个winform的基于TCP的服务端的GPS平台的网关。利用多线程异步的方式 。
- 基于HTTP的多线程文件下载功能实现
- 一个基于src和ashx的无刷新下载文件和更新图片的方法
- 【Linux C/C++】 第08讲 多线程TCP传输文件/select模型
- 分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载 推荐
- 实现多线程下载同一个文件
- 基于HttpClient 4.3.3 的一个上传、下载文件的例子
- 第13章 TCP编程(4)_基于自定义协议的多线程模型
- {网络编程}和{多线程}应用:基于TCP协议【实现多个客户端发送文件给一个服务器端】--练习
- 发一个多线程通过 HTTP 下载文件的类(Linux下的实现)