socket文件传送的问题,大家帮我看看这段程序为什么有问题?(100分)

  • 主题发起人 主题发起人 yxylwt
  • 开始时间 开始时间
Y

yxylwt

Unregistered / Unconfirmed
GUEST, unregistred user!
下面是接收的部分代码:

procedure TMainForm.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
MyBuffer: array[0..10000] of byte;
S: string;
Len:Integer;
begin

if MySize = 0 then
begin
S := Socket.ReceiveText;
MySize := Strtoint(S);
Socket.SendText('Ready');
end
else begin
Len := socket.ReceiveLength;
StatusBar1.SimpleText := '正在接收数据,数据大小为:' + IntToStr(MySize);
Socket.ReceiveBuf(MyBuffer, len);
Stream.Write(MyBuffer, len);
//Socket.ReceiveBuf(MyBuffer, socket.ReceiveLength);
//Stream.Write(MyBuffer, socket.ReceiveLength);
//注意:上面的代码改为注释掉的代码,效果不一样,真是奇怪!
if Stream.Size >= MySize then
begin
Stream.Position := 0;
Stream.SaveToFile('e:/data.xml');
MySize := 0;
end;
end;

end;
 
另外:上面的代码在win98下工作就可以
但在2000下不行
 
上面的代码问题:接受的数据包与发送的不一样
 
在Socket.ReceiveBuf(MyBuffer, socket.ReceiveLength)后,Socket的接收Buf中已经认为无内容,
接下再用socket.ReceiveLength当然就错了
 
谢谢brokensun的提醒,不过我现在我就是不用注释掉的代码,他还是出错~
 
不好意思,直观的从上面的代码上看不出什么问题(眼浊),不知是出什么错,是达不到预期目的,
还是代码在执行时出错,有的话是什么出错信息
 
to brokesun:
我发送一个data.xml的文件
接收到的文件与发送的文件不一样
提示出错很奇怪:
说'什么什么'is not a valid integer value
错误代码:Error Happen, Error Code:10053
如果你有什么其他的解决方法,也请你指点下
socket编程,我是刚刚搞,很多函数到底是怎么回事,我不是很清楚。
 
我也不熟
呵呵,你的MySize := Strtoint(S);容易出现'is not a valid integer value’的错误提示
你是先发文件的大小,然后再把文件发过去?
你这代码在接收第一遍文件时也出错么?
 
这个问题我知道。
问题地关键在于ReceiveLength,它得到的是当前缓冲区中接受到数据的估计值。
而不是精确值。要得到精确值很简单,ReceiveBuf函数的返回值就是当前接受到数据
的精确值。
程序的关键部分这样来改:
Num:=Socket.ReceiveBuf(MyBuffer, SizeOf(MyBuffer));
Stream.Write(MyBuffer, Num);


 
Socket在接收时的缓冲区在Default Size是8192,如果你在服务端的发送的文件文件大于8192
的话,那在接收的时候,可能会有问题,所以最好发送文件大小过去,再开始接受文件,直到
把那个文件完全全部收完为止。
 
楼上老兄错了,现在设置的缓冲区是10000,而不会用Default Size
Onread是事件,如果文件的大小大于10000,那么一次接受不完,它会多次接受。
一直到接受完为止。当然,文件大小传过去也是必要的,这样可以知道,客户端
究竟接受完没有。
 
我已经给你发了代码过去了
 
多人接受答案了。
 
确实看不出来,我以前也是这么做的。
 
后退
顶部