客户端和服务端连接之后进行文件的传输,当客户端不想传输时怎么中止传输? 客户端和服务端都有一个线程用于接收和发送数据的
客户端
CreateThread(NULL,0,CLisen,this,0,NULL);
DWORD WINAPI CLisen(LPVOID lparam)
{
CMyDlg *dlg = (CMyDlg*)lparam; COMMAND command;
memset((char*)&command, 0, sizeof(command)); while(true)
{
while(true)
{
memset((char*)&command, 0, sizeof(command));
if(recv(server, (char*)&command, sizeof(command), 0)==0)
{
break;
}
else
{
switch(command.ID)
{
case GetDriver:
dlg->GetDriverProc(command.lparam);
break;
case GetDirInfo:
dlg->GetDirInfoProc(command.lparam);
break;
case ExecFile:
dlg->ExecFileProc(command.lparam);
break;
case GetFile:
dlg->GetFileProc(command.lparam);
break;
case PutFile:
dlg->PutFileProc(command.lparam);
break;
case FileInfo:
dlg->GetFileInfoProc(command.lparam);
break;
case CreateDir:
dlg->CreateDirProc(command.lparam );
break;
case DelDir:
dlg->DelDirProc(command.lparam );
break;
case ShutDown:
dlg->ShutDownProc(command.lparam );
}
}
}
} closesocket(server);
WSACleanup();
return 0;
}
void CMyDlg::OnExecFile()
{
// TODO: Add your command handler code here
HTREEITEM CurrentNode=m_tree.GetSelectedItem();
if(CurrentNode==NULL)
{
return;
}
CString Temp;
CString FullPath="";
while(CurrentNode!=m_hRoot)
{
Temp=m_tree.GetItemText(CurrentNode);
if(Temp.Right(1)!="\\")
{
Temp+="\\";
}
FullPath=Temp+FullPath;
CurrentNode=m_tree.GetParentItem(CurrentNode);
}
POSITION pos;
pos=m_list.GetFirstSelectedItemPosition();
int i;
i=m_list.GetNextSelectedItem(pos);
if(i>=0)
{
FullPath+=m_list.GetItemText(i,0);
}
else
{
MessageBox("请选择要运行的文件");
}
COMMAND command;
memset((char*)&command,0,sizeof(command));
command.ID=ExecFile;
strcpy((char*)command.lparam,FullPath.LockBuffer());
if(send(server,(char*)&command,sizeof(command),0)==SOCKET_ERROR )
{
MessageBox("客户端发送执行文件路径给服务端失败!");
}}
void CMyDlg::GetFileProc(BYTE* DATE)
{
FILEINFO* fi=(FILEINFO*)DATE;
CFile file;
PublicDir+="\\";
PublicDir+=fi->FileName; int FileLen;
FileLen=fi->FileLen;
int nChunkCount;
nChunkCount=FileLen/CHUNK_SIZE;
if(nChunkCount%CHUNK_SIZE!=0)
{
nChunkCount++;
}
m_pro.SetRange(0,nChunkCount);
m_pro.SetStep(1);
if(file.Open(PublicDir,CFile::modeWrite|CFile::typeBinary|CFile::modeCreate )) {
char* date=new char[CHUNK_SIZE];
for(int i=0;i<nChunkCount;i++)
{
m_pro.StepIt();
int nLeft;
if(i+1==nChunkCount)
{
nLeft=FileLen-CHUNK_SIZE*(nChunkCount-1);
}
else
{
nLeft=CHUNK_SIZE;
}
int idx=0;
while(nLeft>0)
{
int ret=recv(server,&date[idx],nLeft,0);
if(ret==SOCKET_ERROR)
{
MessageBox("文件传输过程发生错误");
break;
}
nLeft-=ret;
idx+=ret;
}
file.Write(date,CHUNK_SIZE);
}
file.Close();
delete[] date;
MessageBox("文件传输完毕");
m_pro.SetPos(0);
GetDlgItem(IDC_WORK_STATIC)->SetWindowText("文件下载完毕");
}
}
客户端
CreateThread(NULL,0,CLisen,this,0,NULL);
DWORD WINAPI CLisen(LPVOID lparam)
{
CMyDlg *dlg = (CMyDlg*)lparam; COMMAND command;
memset((char*)&command, 0, sizeof(command)); while(true)
{
while(true)
{
memset((char*)&command, 0, sizeof(command));
if(recv(server, (char*)&command, sizeof(command), 0)==0)
{
break;
}
else
{
switch(command.ID)
{
case GetDriver:
dlg->GetDriverProc(command.lparam);
break;
case GetDirInfo:
dlg->GetDirInfoProc(command.lparam);
break;
case ExecFile:
dlg->ExecFileProc(command.lparam);
break;
case GetFile:
dlg->GetFileProc(command.lparam);
break;
case PutFile:
dlg->PutFileProc(command.lparam);
break;
case FileInfo:
dlg->GetFileInfoProc(command.lparam);
break;
case CreateDir:
dlg->CreateDirProc(command.lparam );
break;
case DelDir:
dlg->DelDirProc(command.lparam );
break;
case ShutDown:
dlg->ShutDownProc(command.lparam );
}
}
}
} closesocket(server);
WSACleanup();
return 0;
}
void CMyDlg::OnExecFile()
{
// TODO: Add your command handler code here
HTREEITEM CurrentNode=m_tree.GetSelectedItem();
if(CurrentNode==NULL)
{
return;
}
CString Temp;
CString FullPath="";
while(CurrentNode!=m_hRoot)
{
Temp=m_tree.GetItemText(CurrentNode);
if(Temp.Right(1)!="\\")
{
Temp+="\\";
}
FullPath=Temp+FullPath;
CurrentNode=m_tree.GetParentItem(CurrentNode);
}
POSITION pos;
pos=m_list.GetFirstSelectedItemPosition();
int i;
i=m_list.GetNextSelectedItem(pos);
if(i>=0)
{
FullPath+=m_list.GetItemText(i,0);
}
else
{
MessageBox("请选择要运行的文件");
}
COMMAND command;
memset((char*)&command,0,sizeof(command));
command.ID=ExecFile;
strcpy((char*)command.lparam,FullPath.LockBuffer());
if(send(server,(char*)&command,sizeof(command),0)==SOCKET_ERROR )
{
MessageBox("客户端发送执行文件路径给服务端失败!");
}}
void CMyDlg::GetFileProc(BYTE* DATE)
{
FILEINFO* fi=(FILEINFO*)DATE;
CFile file;
PublicDir+="\\";
PublicDir+=fi->FileName; int FileLen;
FileLen=fi->FileLen;
int nChunkCount;
nChunkCount=FileLen/CHUNK_SIZE;
if(nChunkCount%CHUNK_SIZE!=0)
{
nChunkCount++;
}
m_pro.SetRange(0,nChunkCount);
m_pro.SetStep(1);
if(file.Open(PublicDir,CFile::modeWrite|CFile::typeBinary|CFile::modeCreate )) {
char* date=new char[CHUNK_SIZE];
for(int i=0;i<nChunkCount;i++)
{
m_pro.StepIt();
int nLeft;
if(i+1==nChunkCount)
{
nLeft=FileLen-CHUNK_SIZE*(nChunkCount-1);
}
else
{
nLeft=CHUNK_SIZE;
}
int idx=0;
while(nLeft>0)
{
int ret=recv(server,&date[idx],nLeft,0);
if(ret==SOCKET_ERROR)
{
MessageBox("文件传输过程发生错误");
break;
}
nLeft-=ret;
idx+=ret;
}
file.Write(date,CHUNK_SIZE);
}
file.Close();
delete[] date;
MessageBox("文件传输完毕");
m_pro.SetPos(0);
GetDlgItem(IDC_WORK_STATIC)->SetWindowText("文件下载完毕");
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货