18,356
社区成员
发帖
与我相关
我的任务
分享
void CNetMYS_clndlgDlg::DealDownLoadFile(PACKET *data)
{
DownLoadFileInfo *pdf = NULL;
if(data->head.cPC==0x0000) //表示开始发送数据
{
pdf = (DownLoadFileInfo *)data->pszInfo;
// 这个结构里,保存了要下载文件的大小,crc32等文件信息
if(!pdf->bExist)
{
m_listBoxMsg.AddString("下载失败,服务器端无法打开文件!");
}
else
{
CString s;
s.Format("开始下载文件,文件长度=%d", pdf->nFileLength);
m_listBoxMsg.AddString(s);
DeleteFile("C:\\ext-2.0.zip"); //如果文件存在就删除
}
}
else //这才是表示正式发送的数据
{
CFile f;
f.Open("C:\\ext-2.0.zip", CFile::modeWrite|CFile::modeCreate|CFile::modeNoTruncate, NULL);
f.SeekToEnd();
f.WriteHuge(data->pszInfo, data->head.nlen);
f.Close();
if(data->head.cPC==0x0002)
{
m_listBoxMsg.AddString("文件下载完成");
}
}
}
//服务器端发送数据的代码
void DealDownLoadFile(CHostSocket *socket, char* strFileName)
{
PACKET data;
DownLoadFileInfo df;
memset(&df, 0, sizeof(DownLoadFileInfo));
memset(&data, 0, sizeof(data));
data.head.cFC = 0x0401; //下载文件
CFile f;
int nRt = 0;
BYTE * buff = NULL;
if(f.Open(strFileName, CFile::modeRead|CFile::typeBinary|CFile::shareDenyRead, NULL))
{
//先发送文件是否存在,以及文件的长度
df.nFileLength = f.GetLength();
df.bExist = TRUE;
data.head.nlen = sizeof(df);
data.pszInfo = (BYTE*)&df;
nRt = SendPacket(socket, &data); //回送结果
//
DWORD nCount = 0;
buff = new BYTE[MAX_REQPACK_LEN];
memset(buff, 0, MAX_REQPACK_LEN);
do
{
nCount = f.ReadHuge(buff, MAX_REQPACK_LEN);
printf("read %d bytes\n", nCount);
if(nCount>0)
{
if(nCount == MAX_REQPACK_LEN)
data.head.cPC = 0x0001; //下载发送数据
else
data.head.cPC = 0x0002; //下载完成
data.head.nlen = nCount;
data.head.nSEQ ++;
data.pszInfo = buff;
nRt = SendPacket(socket, &data); //发送数据
if(nRt == SOCKET_ERROR)
{
int err = WSAGetLastError();
printf("SendPacket return %d, WSAGetLastError() = %d \n", nRt, err);
}
else
{
printf("SendPacket return %d \n", nRt);
}
//Sleep(100);
}
}while(nCount==MAX_REQPACK_LEN);
f.Close();
//清除内存
printf("complete!\n");
delete []buff;
}
else
{
//如果打开文件失败
df.nFileLength = 0;
df.bExist = FALSE;
data.head.nlen = sizeof(df);
data.pszInfo = (BYTE*)&df;
SendPacket(socket, &data); //回送结果
}
}
//客户端接受数据的代码
DWORD CALLBACK CNetMYS_clndlgDlg::ReceiveProc(LPVOID lpParm)
{
TRACE("线程函数已经开始");
CNetMYS_clndlgDlg *pDlg = (CNetMYS_clndlgDlg *)lpParm;
CHostSocket *pSocketPtr = &pDlg->m_sClient;
if(NULL == pSocketPtr) return 0;
//
while((pSocketPtr->IsConnected())&&(INVALID_SOCKET != pSocketPtr->GetSocket())){
PACKET data;
int nRet = 0;
memset(&data, 0, sizeof(data));
nRet = RecvPacket(pSocketPtr, &data); //接收数据
if(0 < nRet){
switch(data.head.cFC){
case 0x0001:
//登录
pDlg->DealUserLogin(data.head.cPC);
break;
case 0x0400:
//返回的获得目录列表
pDlg->DealGetDirectory((PMyFileInfo)data.pszInfo);
break;
case 0x0401:
//下载文件
//这个函数没有别的用处,无非就是将数据写到文件里罢了
pDlg->DealDownLoadFile(&data);
break;
case 0x0000:
goto e;
//m_pClientDlg->AcceptProc(&data);
break;
default:
break;
}
//最后要对接收的数据进行释放
FreePacket(&data);
}
//Sleep(1);
}
e:
TRACE("线程函数已经结束");
return 0;
}