客户端和服务端都使用相同大小的缓冲区8192,服务端使用WSAAsyncSelect模型接收文件(FD_READ)while(1)
{
ret=recv(...);
fwrite(...);
if(ret!=8192)
{
fclose(..);
break;
}
}
为什么总是接收不到完整的文件?
{
ret=recv(...);
fwrite(...);
if(ret!=8192)
{
fclose(..);
break;
}
}
为什么总是接收不到完整的文件?
解决方案 »
- 请教关于游戏编程绘图的问题
- 使用DLGTEMPLATE创建非模式对话框的时候,Create函数中的nIDTemplate应该如何传入?
- 求VC社区及开源项目
- 在VC++中如何捕获异常???
- 求救:以16进制格式输出文件
- 请问怎么在MDI中给一个文档添加多个View?
- 请问显示桌面按钮触发的Windows消息是什么?
- 请教CRichEditCtrl的SetWindowText函数问题
- 我的问题还是Microsoft的问题?
- 按F5键调试时"......has exited with code 2 (0x2)."什么意思?
- 关于图形旋转方面的问题,大哥们帮忙看看(100分)
- 基于对话框的UPDATE_COMMAND_UI
while(1)
{
ret=recv(...);
fwrite(...);
if(ret!=8192) //写了文件在判断?那你写入多少byte?写的是什么类型的文件?
{ //一次就一定能够把文件发送完? 建议你思路改改 先发送一个文件头信息
fclose(..); //有很多资料 自己搜一下
break;
}
}
2.我打开文件是用二进制,文件类型应该没有关系吧;
3.正是因为不能一次发送完,所以用了while(1),当缓冲区没有填满时结束;
4.我知道发送文件头信息的好处,不过在这里我只是想知道这种方法错在哪里。谢谢批评。但我仍不知道错在哪里
那接收端为什么还要用while(1)来recv呢? 接收端每次收到 8192 个byte的时候,都会用
FD_READ消息来通知你,你只用响应消息用一个recv(8192);就可以了,就是说你所要做的
是响应每一个FD_READ消息来recv,而不是while(1)来recv2. 没有关系3。照你的思路来看,接收端这里当接收完第一次8192字节的时候你就认为文件接收完毕就fclose
退出了,文件肯定是接收不完全的。4。发送文件头信息只是为了让接收端提前知道文件大小及类型,发不发都无所谓。
谢谢指正。另外,if(ret!=8192)这里是没有错的。