線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3024
推到 Plurk!
推到 Facebook!

P2P的UDP穿NAT传输问题

答題得分者是:zhweizw
fanmeide
一般會員


發表:10
回覆:5
積分:3
註冊:2008-02-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-02-24 09:48:56 IP:219.130.xxx.xxx 訂閱
我刚做网络编程,渴望有人指点
在进行UDP打洞以后 ( C端和S端都用的IDUDPSERVER)
两个C端已经可以互相通信
但是
1:有时会掉包
2:直接以流的方式发送出去后,数据会被改变(因为只有一个端口,上边的信息不知道如何做效验)

我想问的问题就是UDP的文件传输如何效验? 主要指完整性
我现在的思路是先把文件读到流,然后把流一段一段的读出来,再在其前面加个结构(思路就卡在这里了,前面不知道加个什么结构以方便另一端验证。。。)
我对STREAM不熟,希望最好能有源码~~如果看不明白,就只看下面的代码吧


我这里假设文件很小,还不到1024

发送端
var
mm:tfilestrem;
LEN:INTEGER;
p:array [0..1023] of byte;
begin
mm:=tfilestream.creat(mypath,fropen);
len:=mm.size;
mm.read(p,len);
idudpserver2.SendBuffer(chatip,chatport,p,len); //这样就是发文件出去了 我希望的就是在上边的过程中在这个数据包前面加上验证头,类型不限
end;


//现在我接受端 代码大概如下。但是不知道怎么验证数据包,希望能有人解答

//同样是IDUDPSERVER2 。所有C端的这个UDPSERVER都既是发送也是接收

var
mem:tFileStream;
fileName:string;
str:string;
begin
aData.Seek(0,0);
setLength(str,aData.size);
aData.Read(str[1],aData.Size);
if saveDialog1.Execute then begin
FileName:=saveDialog1.FileName;
if FileExists(filename) then
deleteFile(filename);
if mem<>nil then begin
mem.Free;
mem:=nil;
end;
if not fileExists(FileName) then
mem:=TFileStream.Create(FileName,sysutils.fmOpenReadWrite or fmCreate)
else
mem:=TFileStream.Create(FileName,fmopenReadWrite);
end;

if mem<>nil then begin
mem.Seek(0,2);
aData.Seek(0,0);
mem.CopyFrom(aData,aData.Size);
abinding.SendTo(aBinding.PeerIP,aBinding.PeerPort,str[1],length(str));
application.ProcessMessages;
end;

end;


zhweizw
一般會員


發表:7
回覆:16
積分:9
註冊:2008-01-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-02-27 10:27:49 IP:222.187.xxx.xxx 訂閱
文件流传输,建议使用TCP连接。UDP不保证数据完整性。
zhweizw
一般會員


發表:7
回覆:16
積分:9
註冊:2008-01-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-02-27 10:35:16 IP:222.187.xxx.xxx 訂閱
另外关于验证,个人看法,不一定行得通:
定义个传输协议:
Type TCommData = packed record
stSize : integer;//保存流大小
buf : array[0..1023] of byte;
end;
var
FCommData : TCommData;
begin
//在这里将流大小赋值给stSize,在服务器收到数据时验证stSize与实际收到buf的大小,不通则丢弃,要去重新发送。
end;
fanmeide
一般會員


發表:10
回覆:5
積分:3
註冊:2008-02-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-02-27 13:27:01 IP:59.36.xxx.xxx 訂閱
问题已经解决了,谢谢你啦
系統時間:2024-04-29 5:04:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!