用socket分割传送文件,文件>100K为什么传送错误,请看代码

jackyjian 2005-04-20 05:08:11
Server端分割发送文件,点击Button4发送文件
void __fastcall TForm1::Button4Click(TObject *Sender)
{
TMemoryStream * rms=new TMemoryStream();
int len;
void *buf[2048];
if(D->Execute())
{
rms->LoadFromFile(D->FileName);
while(rms->Position!=rms->Size)
{
len=rms->Read(buf,2048);
ServerSocket1->Socket->Connections[0]->SendBuf(buf,len);
}
}
}
Client端收取组装文件
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
void* buf[2048];
int len;
len=Socket->ReceiveBuf(buf,2048);

FILE *fp;
String file=ExtractFilePath(Application->ExeName);
file=file+"\\temp.doc"; //或者temp.jpg
fp=fopen(file.c_str(),"ab+");
fwrite(buf,1,len,fp);
}
当文件<100k时,发送接收正常,当约大于100k时,如果是.doc 文件,也能发送接收正常,但打开时出现"文件路径错误"类似信息.
如果是.jpg文件,打开时图像显示不全,好像100k以上的内容丢失.
...全文
173 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackyjian 2005-04-23
  • 打赏
  • 举报
回复
这些只是我的代码片断,谢谢各位,是结贴的时候了.
jishiping 2005-04-22
  • 打赏
  • 举报
回复
ClientSocket1Read 这个函数中,每次打开文件、关闭文件,效率也太低了吧。应该是Socket
连接上后打开文件,Socket关闭后(或者文件接收完成后)关闭文件。

(你贴出的代码中漏了关闭文件的代码,应该是笔误吧)
jishiping 2005-04-22
  • 打赏
  • 举报
回复
4M的文件要10分钟?不可能吧,再慢也不可能这么慢。
qin_wei 2005-04-22
  • 打赏
  • 举报
回复
在一个文件的接收事务里,文件句柄尽量只打开一次,可以提高效率,如
FILE *fp;
String file=ExtractFilePath(Application->ExeName);
file=file+"\\temp.doc"; //或者temp.jpg
fp=fopen(file.c_str(),"ab+");
fwrite(buf,1,len,fp);
你这段话,fp处理一下作用域,不要每次ClientSocket1Read都重新打开一次,应该是早做好协议的前提下,开始接收时打开,接受完毕在关闭。
jackyjian 2005-04-22
  • 打赏
  • 举报
回复
难道速度问题不能解决吗?
jishiping 2005-04-21
  • 打赏
  • 举报
回复
当server端发送完毕后怎么通知客户端,也就是说客户端怎么知道已经接收完毕
------------------------------------------------
自己定义一个协议。比如,发送文件前,先发送文件的长度(可以用一个4字节长
的DWORD来表示)。这样客户端先读取4个字节的长度,然后再根据长度接收数据,
就知道是不是结束了。
NetSpider9804040 2005-04-21
  • 打赏
  • 举报
回复
帮楼主顶一下!
jackyjian 2005-04-21
  • 打赏
  • 举报
回复
问题解决,谢谢.还有一个问题,当server端发送完毕后怎么通知客户端,也就是说客户端怎么知道已经接收完毕,socket控件可没有类似Onreceivecomplete 事件啊.再有,我感觉我写的这样发送接收的程序速度太慢,4M的文件要近10分钟,不知有什么方法提高发送接收的速度.还请各位大侠指点一二.
jishiping 2005-04-20
  • 打赏
  • 举报
回复
ServerSocket1->Socket->Connections[0]->SendBuf(buf,len);

当你调用 SendBuf 时,实际发送出去的数据不一定刚好就是 len,所以你要改写为:
while(rms->Position!=rms->Size)
{
len = rms->Read(buf, 2048);
for(int n=0; n<len; ) {
int num = ServerSocket1->Socket->Connections[0]->SendBuf(buf+n, len-n);
if (num>0) n += num;
}
}

1,317

社区成员

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

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