CCSDef::TMSG_FILENAME* pRequestFilenameMsg = (CCSDef::TMSG_FILENAME*)pMsgHeader;
printf("File Name: %s\n", pRequestFilenameMsg->szFileName);
// 把文件的路径设置为D盘根目录下
strcpy(g_szFileName, "D:\\");
strcat(g_szFileName, "test2.B_imp");
//strcat(g_szFileName, pRequestFilenameMsg->szFileName);
// 查找相同文件名的文件是否已经存在,如果存在报错退出
FILE* pFile;
if ((pFile = fopen(g_szFileName, "r")) != NULL)
{
// 文件已经存在,要求重新输入一个文件
printf("The file already exist!\n");
CCSDef::TMSG_ERROR_MSG tMsgErrorMsg(MSG_FILEALREADYEXIT_ERROR);
::send(g_sClient, (char*)(&tMsgErrorMsg), sizeof(CCSDef::TMSG_ERROR_MSG), 0);
fclose(pFile);
return false;
}
// 分配缓冲区开始接收文件,如果分配成功就给server端发送开始传送文件的要求
g_pBuff = new char[g_lLength + 1];
if (g_pBuff != NULL)
{
memset(g_pBuff, '\0', g_lLength + 1);
printf("Now ready to get the file %s!\n", pRequestFilenameMsg->szFileName);
CCSDef::TMSG_CLIENT_READY tMsgClientReady;
if (::send(g_sClient, (char*)(&tMsgClientReady), sizeof(CCSDef::TMSG_CLIENT_READY), 0) == SOCKET_ERROR)
{
printf("Send Error!\n");
exit(-1);
}
}
else
{
printf("Alloc memory for file error!\n");
exit(-1);
}
return true;
}
// 写入文件
bool WriteToFile(CCSDef::TMSG_HEADER *pMsgHeader)
{
assert(pMsgHeader != NULL);
CCSDef::TMSG_FILE* pMsgFile = (CCSDef::TMSG_FILE*)pMsgHeader;
int nStart = pMsgFile->tFile.nStart;
int nSize = pMsgFile->tFile.nSize;
memcpy(g_pBuff + nStart, pMsgFile->tFile.szBuff, nSize);
if (nStart == 0)
{
printf("Saving file into buffer…\n");
}
memcpy(g_pBuff + nStart, pMsgFile->tFile.szBuff, nSize);
// 如果已经保存到缓冲区完毕就写入文件
if (nStart + nSize >= g_lLength)
{
printf("Writing to disk…\n");
// 写入文件
FILE* pFile;
pFile = fopen(g_szFileName, "w+b");
fwrite(g_pBuff, sizeof(char), g_lLength, pFile);
delete [] g_pBuff;
g_pBuff = NULL;
fclose(pFile);
// 保存文件成功传送消息给server退出server
CCSDef::TMSG_SENDFILESUCCESS tMsgSendFileSuccess;
while (::send(g_sClient, (char*)(&tMsgSendFileSuccess), sizeof(CCSDef::TMSG_SENDFILESUCCESS), 0) == SOCKET_ERROR)
{
}
printf("Save the file %s success!\n", g_szFileName);
return true;
}
else
{
return false;
}
}
// 处理server端传送过来的消息
bool ProcessMsg()
{
CCSDef::TMSG_HEADER *pMsgHeader;
int nRecv = ::recv(g_sClient, g_szBuff, MAX_PACKET_SIZE + 1, 0);
pMsgHeader = (CCSDef::TMSG_HEADER*)g_szBuff;
switch (pMsgHeader->cMsgID)
{
case MSG_OPENFILE_ERROR: // 打开文件错误
{
OpenFileError(pMsgHeader);
}
break;
case MSG_FILELENGTH: // 文件的长度
{
if (g_lLength == 0)
{
g_lLength = ((CCSDef::TMSG_FILELENGTH*)pMsgHeader)->lLength;
printf("File Length: %d\n", g_lLength);
}
}
break;
case MSG_FILENAME: // 文件名
{
return AllocateMemoryForFile(pMsgHeader);
}
break;
case MSG_FILE: // 传送文件,写入文件成功之后退出这个函数
{
if (WriteToFile(pMsgHeader))
{
/*Sleep(1000);*/
return false;
}
}
break;
}
return true;
}