您的位置:首页 > 理论基础 > 计算机网络

一个基于TCP的多线程文件下载模型

2011-12-23 22:12 253 查看
服务端代码:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: