P2P 程式在有虛擬 IP (IP分享器) 的環境該如何運作呢??? |
尚未結案
|
smallma
一般會員 發表:8 回覆:11 積分:3 註冊:2003-03-05 發送簡訊給我 |
小弟利用IdTCPClient和IdTCPServer寫了一個 P2P 的傳訊及傳檔程式,
在二個Client端都有真實IP的情況下可正常運作,但是只要有其中一端有使用IP分享器,就完全沒有辦法運作,不知道那一位大大可以提供我一個解決方案,以下是我程式的部分code: 程式分project1(Form1)及project2(From2),project2所在的電腦有使用IP分享器。 (1)project1開啟時會設好IdTCPServer的接受port為9999(假設這是一個open的port) procedure TForm1.FormCreate(Sender: TObject);
begin
IdTCPServer1.DefaultPort := 9999;
IdTCPServer1.Active := True;
end; (2)由project2開啟連結到project1,並將project2的IdTCPServer1(接受元件)的port設為IdTCPClient1(發送元件)的port,
並開啟之。 procedure TForm2.Button1Click(Sender: TObject);
begin
IdTCPClient1.Disconnect;
IdTCPClient1.Host := self.Edit1.Text; //project1所在的IP(真實IP)
IdTCPClient1.Port := 9999;
IdTCPClient1.Connect;
IdTCPClient1.WriteLn('hello');
IdTCPServer1.Active := False;
IdTCPServer1.DefaultPort := IdTCPClient1.Binding.Port;
IdTCPServer1.Active := True; IdTCPClient1.DisConnect;
end; (3)project1接到資料,取得project2所在的IP及Port,將傳來的IP和Port存在Edit1及Edit2中。 procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var str: string;
begin
with AThread.Connection do begin
str := ReadLn; //這裡應該收到"hello"
Edit1.Text := Binding.PeerIP;
Edit2.Text := IntToStr(Binding.PeerPort);
end;
end; (4)再由project1送資料回到project2 procedure TForm1.Button1Click(Sender: TObject);
begin
self.IdTCPClient1.Disconnect;
self.IdTCPClient1.Host := Edit1.Text;
self.IdTCPClient1.Port := StrToInt(Edit2.Text);
self.IdTCPClient1.Connect; //如果project2在IP分享器之後,這裡會失敗
self.IdTCPClient1.WriteLn('hello');
self.IdTCPClient1.Disconnect;
end; (5)projcet2收到訊息,show一個message procedure TForm2.IdTCPServer1Execute(AThread: TIdPeerThread);
var str: string;
begin
with AThread.Connection do begin
str := ReadLn;
showmessage(str);
end;
end; 這個程式很簡單,是由 project2 傳資料到 project1,再由 project1 傳資料到 project2,如果二端都是真實IP的話,運作上完全不會有問題,但問題就出在如果 project2 是在IP分享器之後,project1收到的ip和port會是經過IP分享器轉譯過的,如果照著(3)抓取到的資料回連的話,在(4)的地方就會連結失敗,我曾經想到的解決方式有以下幾個: <1>在(2)的部分不要Disconnect,用ReadLn取得 project1 傳給 project2 的資料,但是這樣如果 project1 接到資料,但沒有按下Button1送資料回去的時候,project2就會當掉。 <2>透過第三支程式轉接,由 project1 和 project2 分別連結之,但是一樣會有這種問題,project2的IdTCPClient1如果要"等待"接受資料,一樣要用ReadLn,同樣會造成project2當掉。 <3>設定IP分享器的其中一個port固定傳到 project2 所在的電腦,可是並不是每個user都會設定,而且同一個IP分享器後的電腦只能有一台使用這個程式,似乎也不是正解。 我看像icq,msm等軟體都可以在IP分享器之後正常運作,也不用做什麼特別的設定,不知道他們是怎麼做到的,希望各位大大為我指點迷津,不勝感激
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
那是因為防火牆檔下來的原因,
我看過很多有關可以突破防火牆的通訊方式,
但都試不成功! 我自己的結論如下:
1.防火牆檔進不檔出,所以當做Server端的防火牆的Port要打開,
您的project1與project2都有用到IdTCPServer,所以雙方的佛火牆的Port都要開才行!
2.為何MSN可以通過?因為MSN的程式都為Client端,連到MSN的Server端都為出口的訊號,所以防火牆不用檔,只要MSN的Server端的防火牆有開Port,就大家都可以上MSN Server,在透過MSN Server來互相通訊!
如同本站的DelphiChat聊天討論室一樣:http://delphi.ktop.com.tw/delphichat.asp ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
smallma
一般會員 發表:8 回覆:11 積分:3 註冊:2003-03-05 發送簡訊給我 |
非常感謝站長這麼快就有回應,我其實我並不知道自己用的IP分享器有沒有防火牆的功能在內。 現在的問題是由IP分享器內向外的實體ip建立連結都沒問題,只要連結一建立,資料就可進也可出,可是只要連結一斷就掛了,主要的原因是因為原來的Port Mapping已經不在了,就像我程式寫的,就算用同樣的port反向連回去都不行。 這在p2p方面是一個很大的問題,我的想法是一定有解決的方案,不然像很多p2p的軟體不但要傳訊息(這部份靠server轉接還可以),還要傳檔案(如果這也靠server的話那有會多可怕,server就算有再大的頻寬也不夠,好像不太可能^^|||)。 我試過很多套p2p的軟體,即使在IP分享器後執行也沒有問題,上傳下載都很正常,我一直不了解他們是怎麼做的,我一直懷疑,是不是在登入時傳了什麼特別的識別資料給server,讓別的user可以用不止ip及port的方式找到自己這台電腦,亦或是用了特別的元件或協定,希望各位高手大大能多多指點一下
|
jaya
初階會員 發表:9 回覆:70 積分:30 註冊:2002-05-22 發送簡訊給我 |
所謂的防火牆,就是用來阻隔Internet與Lan之間的連線
只有經過允許的特定功能才可以通過.
NAT機制本身就是可出不可進的機制,而IP Share 基本上就是 NAT 的功能,
所以也可以當做防火牆來看待. 然而為了方便在Lan內架設伺服器,所以才又發展出Map的功能.
讓Internet可以有條件的連到Lan裡面.
而Map又區分為 IP 和 Port 二種.(扯遠了....) 我也試過很多 P2P 的軟體.如果要能夠直接對傳檔案的話,
至少要有一方擁有真實 IP 才行.
以 ICQ 為例,接收檔案的一方需要有真實 IP.
若是不符規則的話,會造成傳送失敗. 再以 Yahoo! Messager 為例.
如果雙方都在 IP Share 之下的話,檔案也可以傳送.
但是..... 傳送方上傳完成後,接收方才開始下載.
這應該是經由伺服器轉送的關係.
|
alex0628
一般會員 發表:13 回覆:24 積分:7 註冊:2002-04-15 發送簡訊給我 |
|
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |