请问是不是流指针的问题。请帮帮忙。

Atomictry 2003-05-23 05:37:02
这是在socket服务端(用的是多线程)中的一段程序,我本来是用流来传的,但失败了。
就用缓冲区了。
static long jpgsize;
unsigned long buffersize=0;
char buffer[4097];
TJPEGImage *Jpeg=new TJPEGImage();
TMemoryStream *pms =new TMemoryStream();
TWinSocketStream *pStream;


if(ReceiveStr=="可以发送jpg文件总长度了")
{
Jpeg->LoadFromFile("10.jpg");
Jpeg->SaveToStream(pms);
pms->SaveToFile("40.jpg"); //这里倒还可以存储;
Jpeg->Free();
pms->Position=0; //????????????
jpgsize=pms->Size;
AnsiString ConverStr="@size:"+IntToStr(jpgsize);
pStream->WriteBuffer(ConverStr.c_str(),ConverStr.Length()); //发送文件长度到客户端;
}//这里从客户端反映出来字节长度都是对的。


if(ReceiveStr=="已收到文件长度,可以发送文件了")
{
pms->Position=0;
pms->SaveToFile("30.jpg"); //把10.jpg存成30.jpg居然字节为零。好象这里的pms流根本就没有建成;why???????
do{
buffersize=pms->Read(buffer,4096);
if(buffersize>0)
{
buffer[buffersize]=0;
pStream->WriteBuffer(buffer,buffersize);
}
}while(buffersize==4096);
}


请问在csdn混的GG,JJ,DD,MM为什么不可以存储30.jpg?
pms流一直没有Clear()掉,流指针不是复位了吗?
是不是流创建错了?在此谢过。
...全文
43 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Atomictry 2003-05-25
  • 打赏
  • 举报
回复
没有代码了,所以才奇怪。客户端先发“可以发送jpg文件总长度了”;然后服务端就发文件长度;客户端收到后发“已收到文件长度,可以发送文件了”;然后服务端开始执行第二个if语句(确信可以收到“已收到文件长度,可以发送文件了”),但这里pms流好象不存在了(因为我试着把它存为一个文件或者取它的长度都失败了)。
请帮想一下。谢谢。
jingrunx 2003-05-25
  • 打赏
  • 举报
回复
}//这里从客户端反映出来字节长度都是对的。
//在这中间有没有其他代码?
if(ReceiveStr=="已收到文件长度,可以发送文件了")
Atomictry 2003-05-25
  • 打赏
  • 举报
回复
更正:好象不需要发文件长度。
Atomictry 2003-05-25
  • 打赏
  • 举报
回复
终于等到老师了。谢谢您。
我先发文件长度给客户端是因为客户端不知道何时文件传输已经结束。

我是尝试这样做的:
服务端收到客户端发送请求后,服务端先发该文件的总长度,客户端收到总长度后,再发一个“可以传输文件”的请求;此时服务端就可以正式发送文件了。此后客户端就接收缓冲区的数据,由先前得到的文件长度判断是不是传输结束了,然后根据得到的扩展名存储成文件。
我刚开始学写程序,也想有条理,可是做不到呀。您的那个代码在您告诉我之前,我早就收藏了,HoHo~~。这正研究着呢,虽然很清晰,但是不好看(难看)。:(


pms->SaveToFile("40.jpg"); //这里倒还可以存储
pms->SaveToFile("30.jpg"); //把10.jpg存成30.jpg居然字节为零。
这两句是我用来调试用的。奇怪的是“pms->SaveToFile("30.jpg");”居然得不到结果,pms流我一直没有释放呀。
还请问大哥哥:我不发文件长度,客户端如何得知文件传输结束。听您的意思,好象发长度。那又如何判断结束。

pp616 2003-05-24
  • 打赏
  • 举报
回复
服务器端收文件。你又不是断点续传,为什么要发送文件长度给客户端?(不明白)

pms->SaveToFile("40.jpg"); //这里倒还可以存储;
只要pms不是局部变量,或是pms给删除。
再调用
pms->SaveToFile("30.jpg");是不会出问题的。你要仔细检查你的代码。
还有我觉得你的发送和接收方式不太科学。
http://www.cnxbb.com/bcb/SocketFileTransmit.rar
这是个我写的小文件传输组件,全api封装,你可以看看。
pp616 2003-05-24
  • 打赏
  • 举报
回复
有这么复杂吗??
Atomictry 2003-05-24
  • 打赏
  • 举报
回复
现在我改了方法,先不发长度,服务端读到缓冲区长度小于4096后,就发文件传输结束标志。
这样客户端就需要查找此标志。
这个传输速度可慢多了。大虾们,可怜可怜我,帮帮忙吧。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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