请问这个文件传输程序究竟有什么不对,为什么只能传几十K的文件?(100分)

  • 主题发起人 主题发起人 Frankylui
  • 开始时间 开始时间
F

Frankylui

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟找到了一个用Window API 写的文件传输程序,但该程序只能传几十K的文件,超过的话就会有问题,
恳请各位高手指点一下?

(以下为传送文件主要过程的代码。)
//文件传输主过程
procedure TForm1.TransFile(filename:String);
//定义数据块的大小 4K
Const BlockLen=1024*4;

var Ftrans:File of Byte;
Flen:Integer;
//为将长文件分块,定义相应的变量,BlockNum数据块的数量
//剩余长度
BlockNum,RemainLen:Integer;
//定义数据缓冲区 大小4K
BlockBuf:Array[0..BlockLen-1] of Byte;

i:Integer;
SendLen:Integer;
//定义 WinSock API 调用相关变量
Client:TSocket; //定义一个client对象
ca:SOCKADDR_IN;
hostaddr:u_long;

begin
//调用 WinSock API 函数创建Socket(客户端)
Client:=Socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
if Client=INVALID_SOCKET then
begin
StatusBar1.SimpleText:='为连接远程服务器端创建Socket错误!' ;
Exit;
end;
//定义协议族
ca.sin_family:=PF_INET;
//将端口号由主机字节顺序转换为网络字节顺序
//调用htons函数
ca.sin_port:=htons(StrToInt(Trim(edit2.Text)));
//调用inet_addr函数将点分十进制IP地址转换成网络地址,
//此过程隐含地实现了到网络字节的转换
hostaddr:=inet_addr(PChar(Trim(edit1.Text)));
//此处需要说明;

//验证网络字节是否正确
if (hostaddr=-1) then
begin
StatusBar1.SimpleText:=' 主机IP地址 :'+Trim(edit1.Text)+' 错误!' ;
closesocket(Client);
Exit;
end
else
//转换成功,对地址部分赋值

ca.sin_addr.S_addr:=hostaddr;

//连接由协议族、地址、端口三元组确定了的服务器端
if connect(Client,ca,sizeof(ca))<>0 then
begin
StatusBar1.SimpleText:='连接服务器端Socket错误!';
closesocket(Client);
Exit;
end
else
StatusBar1.SimpleText:='连接远程Socket成功!' ;

//将一些列的常规文件操作与网络应用结合起来
AssignFile(Ftrans,filename);
Reset(Ftrans);
Flen:=FileSize(Ftrans);

//计算,按设置的缓冲区的大小,文件可以被分割成多少块
BlockNum:=Flen div BlockLen;

//设定进度栏的显示
ProgressBar1.Max:=1+BlockNum;

//文件分割后剩余的字节
RemainLen:=Flen mod BlockLen;

//开始传输
StopTrans:=False;
InTrans:=True;
SendLen:=1;

//对文件进行分块发送
for i:=0 to BlockNum-1 do
begin

//判断是否终止传送和出现传送错误
if (StopTrans)or(SendLen<=0) then Break;
//从源文件读出数据
BlockRead(Ftrans,BlockBuf[0],BlockLen);

//调用send函数发送
SendLen:=send(Client,BlockBuf,BlockLen,0);

//更新进度栏的显示
ProgressBar1.Position:=i;

//并且给应用程序一定的处理时间
Application.ProcessMessages;
end;


if StopTrans then
begin

//判断是否传送终止,进行收尾工作
CloseFile(Ftrans);
closesocket(Client);
InTrans:=False;
StatusBar1.SimpleText:='';
MessageBox(Handle,'停止传输!','提示',MB_OK);
ProgressBar1.Position:=0;
Exit;
end;

//判断是否异常终止传送
if (SendLen<=0) then
begin
CloseFile(Ftrans);
closesocket(Client);
InTrans:=False;
StatusBar1.SimpleText:='';
MessageBox(Handle,'传输异常终止!','提示',MB_OK);
ProgressBar1.Position:=0;
Exit;
end;

//判断分块完成后,是否有余下的数据还没被发送
//注意药用 RemainLen>0 来排除正好分成N块的特殊情况
if RemainLen>0 then
begin
//读入数据并进行发送
BlockRead(Ftrans,BlockBuf[0],RemainLen);
SendLen:=send(Client,BlockBuf,RemainLen,0);
//进行错误检查
if (SendLen<=0) then
begin
CloseFile(Ftrans);
closesocket(Client);
InTrans:=False;
StatusBar1.SimpleText:='';
MessageBox(Handle,'传输异常终止!','提示',MB_OK);
ProgressBar1.Position:=0;
Exit;
end;
end;
//更新显示
ProgressBar1.Position:=ProgressBar1.Max;
//进行收尾工作
CloseFile(Ftrans);
closesocket(Client);
InTrans:=False;
StatusBar1.SimpleText:='';
MessageBox(Handle,'传输完成!','提示',MB_OK);
ProgressBar1.Position:=0;
end;
 
应以文件流来传输,你去找相关的资料
 
报的是什么错误 啊?
 
这段代码问题多多...
是从那本DELPHI6网络编程(铁道)上抄下来的把?
如何修改,那本书的作者都说了的,最好是把他
写到线程里去,还有很多地方要修正,我相信楼
主这点动手能力还是有的
 
后退
顶部