// 传送文件
bool SendFile(SOCKET sClient)
{
if (NULL == g_pBuff)
{
ReadFile(sClient);
}
int nPacketBufferSize = MAX_PACKET_SIZE - 2 * sizeof(int); // 每个数据包存放文件的buffer大小
// 如果文件的长度大于每个数据包所能传送的buffer长度那么就分块传送
for (int i = 0; i < g_lLength; i += nPacketBufferSize)
{
CCSDef::TMSG_FILE tMsgFile;
tMsgFile.tFile.nStart = i;
if (i + nPacketBufferSize + 1> g_lLength)
{
tMsgFile.tFile.nSize = g_lLength - i;
}
else
{
tMsgFile.tFile.nSize = nPacketBufferSize;
}
//printf("start = %d, size = %d\n", tMsgFile.tFile.nStart, tMsgFile.tFile.nSize);
memcpy(tMsgFile.tFile.szBuff, g_pBuff + tMsgFile.tFile.nStart, tMsgFile.tFile.nSize);
char* pTemp = new char[sizeof(CCSDef::TMSG_FILE)];
memcpy(pTemp,&tMsgFile,sizeof(CCSDef::TMSG_FILE));
::send(sClient, pTemp, sizeof(CCSDef::TMSG_FILE), 0);
Sleep(0.5);
}
delete [] g_pBuff;
g_pBuff = NULL;
return true;
}// 写入文件
bool WriteToFile(CCSDef::TMSG_HEADER *pMsgHeader)
{
assert(NULL != pMsgHeader);
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 (0 == nStart)
{
printf("Saving file into buffer...\n");
}
memcpy(g_pBuff + nStart, pMsgFile->tFile.szBuff, nSize);
//printf("start = %d, size = %d\n", nStart, 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 (SOCKET_ERROR == ::send(g_sClient, (char*)(&tMsgSendFileSuccess), sizeof(CCSDef::TMSG_SENDFILESUCCESS), 0))
{
}
printf("Save the file %s success!\n", g_szFileName);
return true;
}
else
{
return false;
}
}
以上代码是socket传文件的,包含分块传送文件,但是我测试过了,只能传10M以内的文件,也就是说分块传没启作用。
如何才能传送大文件?????
bool SendFile(SOCKET sClient)
{
if (NULL == g_pBuff)
{
ReadFile(sClient);
}
int nPacketBufferSize = MAX_PACKET_SIZE - 2 * sizeof(int); // 每个数据包存放文件的buffer大小
// 如果文件的长度大于每个数据包所能传送的buffer长度那么就分块传送
for (int i = 0; i < g_lLength; i += nPacketBufferSize)
{
CCSDef::TMSG_FILE tMsgFile;
tMsgFile.tFile.nStart = i;
if (i + nPacketBufferSize + 1> g_lLength)
{
tMsgFile.tFile.nSize = g_lLength - i;
}
else
{
tMsgFile.tFile.nSize = nPacketBufferSize;
}
//printf("start = %d, size = %d\n", tMsgFile.tFile.nStart, tMsgFile.tFile.nSize);
memcpy(tMsgFile.tFile.szBuff, g_pBuff + tMsgFile.tFile.nStart, tMsgFile.tFile.nSize);
char* pTemp = new char[sizeof(CCSDef::TMSG_FILE)];
memcpy(pTemp,&tMsgFile,sizeof(CCSDef::TMSG_FILE));
::send(sClient, pTemp, sizeof(CCSDef::TMSG_FILE), 0);
Sleep(0.5);
}
delete [] g_pBuff;
g_pBuff = NULL;
return true;
}// 写入文件
bool WriteToFile(CCSDef::TMSG_HEADER *pMsgHeader)
{
assert(NULL != pMsgHeader);
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 (0 == nStart)
{
printf("Saving file into buffer...\n");
}
memcpy(g_pBuff + nStart, pMsgFile->tFile.szBuff, nSize);
//printf("start = %d, size = %d\n", nStart, 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 (SOCKET_ERROR == ::send(g_sClient, (char*)(&tMsgSendFileSuccess), sizeof(CCSDef::TMSG_SENDFILESUCCESS), 0))
{
}
printf("Save the file %s success!\n", g_szFileName);
return true;
}
else
{
return false;
}
}
以上代码是socket传文件的,包含分块传送文件,但是我测试过了,只能传10M以内的文件,也就是说分块传没启作用。
如何才能传送大文件?????
while((readlen=file.Read(10240, buff) > 0)
send(buff, readlen);
{
bool is_read;
char fullPath[512];
unsigned int size_t;
int fp = 0; //文件句柄
fp = _open( Filename, _O_RDONLY );
if (fp == -1)
{
char errmsg[1024];
sprintf(errmsg, "文件打开错误,文件名:%s",fullPath);
WriteLog(1, errmsg);
return false;
}
else if (fp == 0)
return false;
unsigned int filelen = _lseek(fp, 0L, SEEK_END);
_lseek(fp, 0L, SEEK_SET);
if (fp)//查询错误日志直接读,不用按照业务编码查询
size_t = _read(fp, FileContent, filelen+1);
_close(fp);
FileContent[size_t] = 0;
if (size_t >= filelen)
{
is_read = false; //读取失败
FileContent[0] = 0;
char errmsg[1024];
sprintf(errmsg, "文件超长,读取失败,文件名:%s", fullPath);
WriteLog(1, errmsg);
}
else
is_read = true;
return is_read;
}
这个我试过10几M的文件没有问题,再大的我就不知道了!