在局域网中用BCB中那个控件传文件速度最快 求助!!!

kinglh 2003-03-07 12:54:52
在局域网中用BCB中那个控件传文件速度最快 请指点一下啊! 最好有源程序!

...全文
134 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
pp616 2003-03-12
  • 打赏
  • 举报
回复
不需要什么基础的啊。就那么几个函数。
一点都不困难的。
猛禽 2003-03-10
  • 打赏
  • 举报
回复
楼主,没有SOCKET基础还是别试代码了,给你你也调不通。^_^

听前面的,用TNMstrm控件或Indy的控件,代码就在它们的DEMOS里
kinglh 2003-03-10
  • 打赏
  • 举报
回复
用Socket Api 写基于Tcp 的文件传输有没有代码啊!
pp616 2003-03-09
  • 打赏
  • 举报
回复
用socket api 写。基于tcp.
udp不可靠反而慢。别用先成的控件。没自己写的快。!!!!
codearts 2003-03-09
  • 打赏
  • 举报
回复
其实你还可以用indy的TFtp,用一个服务器的控件和一个客户端的控件,使用简单
invalid 2003-03-08
  • 打赏
  • 举报
回复
客户端的:
//---------------------------------------------------------------------------
void __fastcall TForm1::ToolButton3Click(TObject *Sender)
{
String Message;
FileInfo fInfo;
TFileStream *fStream;
int iDownFileLen = -1;

lgr->Log(1,": 开始从"+tcpClient->Host+"下载数据库...");
this->ADOConnection1->Connected = false;
try{
tcpClient->Disconnect();
tcpClient->Connect();
}
catch(Exception &e)
{
Message="连接到服务器"+tcpClient->Host+"失败!"+e.Message;
MessageBox(Handle,Message.c_str(),"错误",MB_ICONWARNING|MB_OK|MB_SETFOREGROUND);;
lgr->Log(1,":"+Message);
return;
}
strcpy(fInfo.Pwd,"Inspector DataAnts.BAk");
fInfo.Length = this->giBranchNo;
strcpy(fInfo.DesName,"");
strcpy(fInfo.Name,"");
try
{
tcpClient->WriteBuffer(&fInfo,sizeof(FileInfo),true);
::Sleep(1);
}
catch(...)
{
MessageBox(Handle,"发生数据异常,下载失败!","错误",MB_ICONWARNING|MB_OK|MB_SETFOREGROUND);;
lgr->Log(1,":"+Message);
return;
}
try
{
tcpClient->ReadBuffer(&fInfo,sizeof(fInfo));
if(strcmp(fInfo.Pwd,"Inspector DataAnts.BAk")!=0)
{
tcpClient->Disconnect();
MessageBox(Handle,fInfo.Pwd,"错误",MB_ICONWARNING|MB_OK|MB_SETFOREGROUND);;
return;
}
lgr->Log(1,":开始下载!数据文件大小:"+IntToStr(fInfo.Length)+"字节!");
fStream=new TFileStream(this->asCurDir +"\\"+ExtractFileName(fInfo.DesName),fmCreate);
tcpClient->ReadStream(fStream,fInfo.Length,false);
delete fStream;
iDownFileLen = FileSizeByName(this->asCurDir +"\\"+ExtractFileName(fInfo.DesName));
lgr->Log(1,":下载完成!文件大小:"+IntToStr(iDownFileLen)+"字节!");
tcpClient->Disconnect();
if(fInfo.Length != iDownFileLen)
{
lgr->Log(1,":★★★下载数据库文件大小和服务端返回的大小不一致。可能下载失败!");
}
Status = 1;
if(ConnectDB()==0)
{
this->LastDBTime = Now().FormatString("YYYY-MM-DD hh:mm:ss");
ini->WriteString("System","LastDBTime",this->LastDBTime);
Panel2->Caption = "数据库版本:"+LastDBTime;
lgr->Log(1,":下载数据库成功!");
}
Status = 0;
}
catch(Exception &e)
{
lgr->Log(1,":"+e.Message);
MessageBox(Handle,e.Message.c_str(),"错误",MB_ICONWARNING|MB_OK|MB_SETFOREGROUND);
}
}
invalid 2003-03-08
  • 打赏
  • 举报
回复
可以用INdy的组件Tcp组件,有SendFile方法的。
给你段代码:
服务端的:
typedef struct fileInfo
{
char Name[255];
int Length;
char DesName[255];
char Pwd[255];
}FileInfo;

//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPServer1Execute(TIdPeerThread *AThread)
{
FileInfo fInfo;
TFileStream *fStream;

lgr->Log(1,"TCP Connected!");

memset(&fInfo,0,sizeof(fInfo));
try{
AThread->Connection->ReadBuffer(&fInfo,sizeof(fInfo));
}
catch(...)
{
lgr->Log(1,"TCP Read Error!");
return;
}
if(fInfo.Length != this->giBranchNo)
{
strcpy(fInfo.Pwd,("服务器分支号:"+IntToStr(this->giBranchNo)+"和分支号"+IntToStr(fInfo.Length)+"不匹配!").c_str());
AThread->Connection->WriteBuffer(&fInfo,sizeof(FileInfo),true);
lgr->Log(1,"服务器分支号:"+IntToStr(this->giBranchNo)+"和分支号"+IntToStr(fInfo.Length)+"不匹配!");
return;
}
if(strcmp(fInfo.Pwd,"Inspector DataAnts.BAk")!=0)
{
strcpy(fInfo.Pwd,"口令校验失败!");
AThread->Connection->WriteBuffer(&fInfo,sizeof(FileInfo),true);
lgr->Log(1,"口令校验失败!");
return;
}
if(CopyFile((this->asDataDir+"\\DataAnts.Dat").c_str(),(this->asDataDir+"\\DataAnts.Bak").c_str(),FALSE)==0)
{
strcpy(fInfo.Pwd,"拷贝待发送文件失败,可能是服务器太忙,请稍侯再试!");
AThread->Connection->WriteBuffer(&fInfo,sizeof(FileInfo),true);
lgr->Log(1,"拷贝待发送文件失败,请稍侯再试!");
return;

}
strcpy(fInfo.Name,(this->asDataDir+"\\DataAnts.Bak").c_str());
fInfo.Length = FileSizeByName(fInfo.Name);
if(fInfo.Length < 0)
{
fInfo.Length = FileSizeByName(fInfo.Name);
}
strcpy(fInfo.DesName,"DataAnts.Dat");
try
{
AThread->Connection->WriteBuffer(&fInfo,sizeof(FileInfo),true);
::Sleep(1);
AThread->Connection->WriteFile(fInfo.Name);
}
catch(...)
{
lgr->Log(1,"TCP Write Error!");
return;
}
lgr->Log(1,"TCP Disconnected!");
}
kinglh 2003-03-08
  • 打赏
  • 举报
回复
有没有代码啊! 有的话就可以好好看看了
SixYCFire 2003-03-07
  • 打赏
  • 举报
回复
其实cb里有现成的使用TNMStrm和TNMStrmServ就可以和接收了,就和操作本地流文件相似,如果呢就是想从网上下文件,就用winnet(api函数)好了
xgming 2003-03-07
  • 打赏
  • 举报
回复
我用UDP传送,但每次只能传8192字节。
caimouse 2003-03-07
  • 打赏
  • 举报
回复
用TCP最快,
因为发送文件,一般是比较大的数据量.
所以用TCP要比UDP要快多了.
当然你要用多线程和三个TCP来同时传送.
这样的速度就快了.
如果只有一个SOCKET会比用三个SOCKET要慢一点.
penu 2003-03-07
  • 打赏
  • 举报
回复
因为UDP报文无出错重传机制。
gyj_china 2003-03-07
  • 打赏
  • 举报
回复
UDP在网络好的情况下是能达到传输率最快的,但它不保正文件传输的可靠性。

1,316

社区成员

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

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