请高手指点:为什么我的client--server程序只能传送26K以下的文件?

gunboy 2000-05-09 03:54:00
我编了一个在两台机子之间传送文件的程序,可是现在只能传送26K以下的文件,当传送
大于26K的文件时,就会出错,错误是:Debug Assertion Failed!
File:filecore.cpp
Line:258
我用的是CAsyncSocket编的,希望高手能够尽快告诉我,谢谢!
我的EMAIL是:19770707@263.net
...全文
257 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
orochi 2000-05-26
  • 打赏
  • 举报
回复
filecore.cpp 258行是这样一句:
ASSERT(m_hFile!=(UINT)hFileNull);
而且是在seek函数里的。
也就是说,你在调用了CFile的seek函数时,所使用的CFile对象并没有连接到一个打开的文件。
你的程序里在打开文件失败的时候,仅仅是显示调试信息,并没有阻止程序继续执行,然后估计在接下来的file.write()时出错了。因为这个函数是要调用seek()的。
gunboy 2000-05-26
  • 打赏
  • 举报
回复
我加上出错处理函数,可是好象程序还是不行
mach 2000-05-22
  • 打赏
  • 举报
回复
if(signal==2)
{
strcat(FilePath,lpbufname);
CFileException e;
CFile file;
if(!file.Open(FilePath,CFile::modeCreate and CFile::modeWrite and CFile::modeNoTruncate,&e))
{
#ifdef _DEBUG
afxDump<<"File Could Not Be Opened!"<<e.m_cause<<"\n";
#endif
}
char lpbuf[10000];
memset(lpbuf,0,sizeof(lpbuf));
int length;
BOOL flag2=TRUE;
do{
length=Receive((void*)lpbuf,10000,0);
file.Write(lpbuf,length);
if(length!=10000)
flag2=FALSE;
}
while(flag2);

file.Close();//接收文件正文
}
这段程序有不少问题
1.不判断lpbufname是否为合法内容
2.file.open如果失败,并未中断处理,后面file.Write时必将出错
3.length=Receive((void*)lpbuf,10000,0);以为是异步操作,这里可能返回-1,儿后面的调用就变成了file.Write(lpbuf,-1);
Un1 2000-05-22
  • 打赏
  • 举报
回复
假如传送过程中任意原因导致,(int)lpbuflength[0]出错,那程序自然会崩溃。
sailing 2000-05-22
  • 打赏
  • 举报
回复
你为什么不看一看filecore.cpp line 258 是什么呢?
是不是变量有错,而跟文件大小无关?
lapple 2000-05-22
  • 打赏
  • 举报
回复
用WinInet编程传文件
gunboy 2000-05-11
  • 打赏
  • 举报
回复
abentu:
你好!
按你的方法试了试,如果调试客户端,服务端出错,选择重试,服务端说:在读写文件时发生不可知错误。如果调试服务端,客户端出错,选择重试,客户端说:没有找到传输文件。什么原因?
在传输大于26K的文件时,服务端只能收到26K大小的文件,其余部分丢失。
abentu 2000-05-09
  • 打赏
  • 举报
回复
你在出问题时选择重试,进到debug后看一下call stack,看是你的哪个函数调用时出错,再设断点在该函数,单步确定哪一句出错。
gunboy 2000-05-09
  • 打赏
  • 举报
回复
服务端的接收代码我是这样写的,不知到对不对,我怀疑就错在这里:
int signal=0;
char lpbuflength[1];
char lpbufname[256];
void CNewSocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
if(signal==0)
{
memset(lpbuflength,0,sizeof(lpbuflength));
Receive((void*)lpbuflength,1,0);
signal++;
return;
}//接收1字节表示要读的文件名长度

if(signal==1)
{
memset(lpbufname,0,sizeof(lpbufname));
int x=Receive((void*)lpbufname,(int)lpbuflength[0],0);
signal++;
return;
}//接收文件名

if(signal==2)
{
strcat(FilePath,lpbufname);
CFileException e;
CFile file;
if(!file.Open(FilePath,CFile::modeCreate and CFile::modeWrite and CFile::modeNoTruncate,&e))
{
#ifdef _DEBUG
afxDump<<"File Could Not Be Opened!"<<e.m_cause<<"\n";
#endif
}
char lpbuf[10000];
memset(lpbuf,0,sizeof(lpbuf));
int length;
BOOL flag2=TRUE;
do{
length=Receive((void*)lpbuf,10000,0);
file.Write(lpbuf,length);
if(length!=10000)
flag2=FALSE;
}
while(flag2);

file.Close();//接收文件正文
}
AsyncSelect(FD_READ);
CAsyncSocket::OnReceive(nErrorCode);
}

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧