socket发送文件流的问题!

lysh137856 2005-09-14 07:13:16
发送数据流
void __fastcall TfrmLt::SpeedButton1Click(TObject *Sender)
{
TFileStream *SendStream=new TFileStream("D:\\send.jpg",fmOpenRead);
SendStream->Position=0;
ServerSocket1->Socket->Connections[0]->SendStream(SendStream);
Application->MessageBoxA("发送数据成功","信息",MB_OK);
delete SendStream;
}

接收数据:
void __fastcall TfrmLt::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{

int nSize;
char buf[2048];
do {
nSize =ClientSocket1->Socket->ReceiveBuf(buf,sizeof(buf));
if(nSize>0)
{
AcceptStream->Seek(AcceptStream->Size,0);
AcceptStream->Write(buf,nSize) ;

}
}while(nSize>0);
if(AcceptStream->Size==IC_Size)
{
ClientSocket1->Socket->SendText("ok");
Application->MessageBoxA("接收完毕","信息",MB_OK);
delete AcceptStream;
} /**/
}
不知道为什么老是出错,请高手请教,谢谢!
//---------------------------------------------------------------------------
...全文
276 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lysh137856 2005-09-15
  • 打赏
  • 举报
回复
依然是那个错误!
signed 2005-09-15
  • 打赏
  • 举报
回复
jishiping(JSP 季世平) ( ) 说的很正确,只是速度可能会稍慢点
signed 2005-09-15
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ss->Active=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
cs->Active=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
TFileStream *SendStream=new TFileStream("D:\\send.jpg",fmOpenRead);
SendStream->Position=0;
ss->Socket->Connections[0]->SendStream(SendStream);
Application->MessageBoxA("发送数据成功","信息",MB_OK);
//delete SendStream;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)
{
//

}
//---------------------------------------------------------------------------
void __fastcall TForm1::csRead(TObject *Sender, TCustomWinSocket *Socket)
{
//
void *buf[2048];
memset(buf,0x00,sizeof(buf));
int ret=Socket->ReceiveBuf(buf,sizeof(buf));
frec->Write(buf,ret);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
//
frec=new TFileStream("d:\\rec.jpg",fmCreate|fmOpenReadWrite);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
//
delete frec;
}
//---------------------------------------------------------------------------
关闭程序后(关闭接收stream)后就可以浏览到内容了
alloutoflove 2005-09-15
  • 打赏
  • 举报
回复
TFileStream *AcceptStream=new TFileStream("D:\\get.bmp",fmCreate|fmOpenReadWrite);
改成
TFileStream *AcceptStream = new TFileStream("D:\\get.bmp", fmCreate | fmOpenReadWrite | fmShareDenyWrite);

试一下.
lysh137856 2005-09-15
  • 打赏
  • 举报
回复
接收数据:
void __fastcall TfrmLt::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
TFileStream *AcceptStream=new TFileStream("D:\\get.bmp",fmCreate|fmOpenReadWrite);
int nSize;
char buf[2048];
do {
nSize =ClientSocket1->Socket->ReceiveBuf(buf,sizeof(buf));
if(nSize>0)
{
AcceptStream->Seek(AcceptStream->Size,0);
AcceptStream->Write(buf,nSize) ;

}
}while(nSize>0);

if(AcceptStream->Size==IC_Size)
{
ClientSocket1->Socket->SendText("ok");
Application->MessageBoxA("接收完毕","信息",MB_OK);

}

}

报错:Cannot Create file D:\\get.bmp
打开D:\get.bmp查看时,浏览不出来,但文件大小与要发送的一样大
当结束程序时,却能浏览出来。
希望高手指点,或是发个例子参考,谢谢
邮箱:lysh_1020@163.com
jishiping 2005-09-15
  • 打赏
  • 举报
回复
你的这种写法,应该改成:
//...... 你的其它代码
if (AcceptStream->Size==IC_Size)
{
ClientSocket1->Socket->SendText("ok");
Application->MessageBoxA("接收完毕","信息",MB_OK);
}
delete AcceptStream; // 必须无条件加上这行。
jishiping 2005-09-15
  • 打赏
  • 举报
回复
但是你在这个事件中没有得了特 AcceptStream,
-----------------------
应该是
但是你在这个事件中没有 delete AcceptStream,
jishiping 2005-09-15
  • 打赏
  • 举报
回复
当第一次收到 OnRead 事件执行 ClientSocket1Read 时,你 new TFileStream("D:\\send.jpg",fmOpenRead); 时没有问题的,但是你在这个事件中没有得了特 AcceptStream,那么下次收到 OnRead 事件时,你再次执行 new TFileStream("D:\\send.jpg",fmOpenRead); 时就会出错,因为之前文件已经被打开而没有关闭,所以再次打开写就会出错。
lysh137856 2005-09-15
  • 打赏
  • 举报
回复
还是有错呀!
有例子吗?发个过来研究一下好了
lysh_1020@163.com
alloutoflove 2005-09-15
  • 打赏
  • 举报
回复
调试一下, 把
TFileStream *AcceptStream=new TFileStream("D:\\get.bmp",fmCreate|fmOpenReadWrite);
这条语句放到ClientRead外边去,比如Form的构造函数中, 然后再试, 看到底在哪出错...
或者你看一下是不是ClientSocket1Read这段语句不只一次被执行到...
lysh137856 2005-09-15
  • 打赏
  • 举报
回复
报错:Cannot Create file D:\\get.bmp
当程序运行着时 ,打开D:\get.bmp查看时,浏览不出来,但文件大小与要发送的一样大,要复制该文件时,也不能复制,
当结束程序时,却能浏览出来。
alloutoflove 2005-09-15
  • 打赏
  • 举报
回复
你试着接收完然后把这个文件复制到另一个文件中,我想可能是因为操作系统的磁盘后写造成的,文件要关闭之后才能真正保存到硬盘.
signed 2005-09-14
  • 打赏
  • 举报
回复
do {
nSize =ClientSocket1->Socket->ReceiveBuf(buf,sizeof(buf));
if(nSize>0)
{
AcceptStream->Seek(AcceptStream->Size,0);
AcceptStream->Write(buf,nSize) ;

}
}while(nSize>0);
事件触发方式不用循环接收

报错应该是在delete SendStream;
The Windows socket object frees the stream when it is finished with it. Do not attempt to free the stream after it has been passed as a parameter.
这是帮助中说的,socket会自动释放stream,不要尝试手动去释放
signed 2005-09-14
  • 打赏
  • 举报
回复
报什么错?

1,317

社区成员

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

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