UDP传文件的碰到的问题,请指教!(50分)

  • 主题发起人 主题发起人 昊海
  • 开始时间 开始时间

昊海

Unregistered / Unconfirmed
GUEST, unregistred user!
我有NMUDP组件传一个文件,代码如下:
var
tmpMemoryStream: TMemoryStream;
tmpStream: TStream;
begin
tmpFileName := 'c:/321.mp3';
try
tmpMemoryStream := TMemoryStream.Create;
tmpStream := TStream.Create;
tmpStream := TFileStream.Create(tmpFileName, fmOpenRead or fmShareDenyNone);
if tmpStream.Size > 0 then
begin
tmpMemoryStream.LoadFromStream(tmpStream);
UDPServer.SendStream(tmpMemoryStream);//这里总是报错,说地址访问非法,CPU调试窗口显示调用地址为:????
end;
except
//
end;
end;
 
UDP本来就是不可靠的传输方式,用这中方法,可能发不了文件的(IP数据报很小的)
我的做发是:
用UDP(Indy的IDUDP),客户和服务端建立“握手”信号,让服务器做好接收准备,并
创建接收的文件流。然后客户端将要传送文件流分成2K字节的一个个包,并加上UDP包头信息,
包信息为
FD Byte; //接收编号(可以同时接收多个文件)
ID DWORD; //包的编号
PL word; //包数据长度
PM array[1..2048] of char; //包数据
服务器接收到包后,检查该包是不是已经接收,或者包是不是连续的,然后返回信息给客户。
客户端接受到服务器信息后,继续发送包,直到完成
 
你在tmpMemoryStream.LoadFromStream(tmpStream);后面加上一句:
tmpMemoryStream.Position:=0; 试试

 
to 教父:
你的方法我早就试过了,不行。
to djdsz:
有没有Indy的帮助?
 
呵呵,不好意思,为表歉意,如果djdsz 没有Indy的帮助,我就发一个给你吧,如果他
有,我就不和他抢生意了 :)
 
http://www.nevrona.com/Indy/download80.html上有,去看看吧(Demo、Help)
 
我发现当流的大小小于一定的数值时不会出错,大了就错了,我试了一下2k不会错,建议你干脆
自己拆了它,一次一次的发,同时发文件不建议用udp.
 
你还可以用udp发送大文件的,方法是:
首先将文件读入内存流,然后自定义每次发送的大小,并按此大小发送给对方,
对方接收后将接受的放入内存流,反馈一个回应包给发送方。
发送方接受后,继续发送剩下的。直到内存流发完。

还有问题吗?
mail:liutao500@sina.com
 
to 教父:
把你的indy帮助发一份给我吧,谢谢!
 
to 教父: lvchun@21cn.com
 
已经发了
 
udp 协议一次最多传送8k以内的是安全的,我在win97,win98,win2000下测试过。
所以不能一次传一个mp3文件过去。
 
多人接受答案了。
 
to 教父:
把你的indy帮助发一份给我吧,谢谢!

maming_hn@163.com
 
后退
顶部