文件传输WriteFile出错

yangt1100 yangt1100 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
服务器端:


typedef struct _MsgFormat
{
int type; //信息类型
char msg[2048]; //信息内容
long length;//信息长度
}MsgFormat;

//发送文件
DWORD dwRead;
BOOL bOk;
MsgForamt recvMsg;

HANDLE hFile=CreateFile(strFileName,GENERIC_READ,0,0,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,0); //创建文件句柄
while(1)
{
dwRead=0;
memset(recvMsg.msg,0,2048);
bOk=ReadFile(hFile,recvMsg.msg,2048,&dwRead,NULL);//读取文件
if(bOk==FALSE)
{
dlg->PendLog("读取文件出错!");
break;
}
else if(dwRead==0)
{
recvMsg.type=9; //读取文件完成标志
int nSend=::send(socket,(char*)&recvMsg,sizeof(recvMsg),0);//发送文件传送完成标志
if(nSend>0)
{
PendLog("用户 "+strUserName+"发送文件"+strFileName1+"完毕");
}
else
{
MessageBox(_T("发送完毕信息失败"),_T("失败"),MB_OK|MB_ICONERROR);
}
break;
}
else
{
recvMsg.type=2; //发送信息标志
recvMsg.length=dwRead;
int nSend=::send(pSocketClient->s,(char*)&recvMsg,sizeof(recvMsg),0);//发送文件信息
if(nSend<=0)
{
break;
}
}
}
CloseHandle(hFile);//关闭文件句柄



客户端代码:

typedefstruct_MsgFormat
{
inttype;//信息类型
charmsg[2048];//信息内容
longlength;//信息长度
}MsgFormat;

DWORDdwWrite;
boolbOk;
MsgFormat recvMsg;

//创建文件句柄 strFileName为文件名
HANDLE hFile=CreateFile(strFileFullName,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
while(1)
{
memset(recvMsg.msg,0,2048);
int read=::recv(socket,(char*)&recvMsg,sizeof(recvMsg),0); //读取服务器端发送的文件
if(read<=0)
break;

if(recvMsg.type==9)//如果发送的为完成标志则退出
break;

int length=0;
length=recvMsg.length;//服务器端发送信息的长度
bOk=WriteFile(hFile,recvMsg.msg,length,&dwWrite,NULL);//将信息写入到文件中
if(bOk==FALSE)
{
MessageBox(_T("文件写入失败!"),_T("文件下载失败"),MB_OK|MB_ICONERROR);
break;
}
if(dwWrite==0)
break;

}
AfxMessageBox(_T("文件下载完成"));
CloseHandle(hFile);


上述代码是我从我的一个文件传送的小程序中摘录的一部分,其中在客户端将接收到的信息写入到文件时经常有错误发生。
当我发送一个几KB的文件时可以顺利的传完,但发送超过1M左右的文件时就会提示“文件写入失败”,也就是在客户端的WriteFile函数返回FALSE。但奇怪的是当我用相同文件进行单步调试时有不会有出错提示。有哪位高手能不能看看代码看看有什么不完善的地方,请指正!谢谢
...全文
评论 8
收藏 已收藏
分享
返回顶部
yangt1100
网络编程 18,356 成员 64,161 内容