全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2161
推到 Plurk!
推到 Facebook!

P2P 程式在有虛擬 IP (IP分享器) 的環境該如何運作呢???

尚未結案
smallma
一般會員


發表:8
回覆:11
積分:3
註冊:2003-03-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-24 15:49:34 IP:61.222.xxx.xxx 未訂閱
小弟利用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-24 16:36:00 IP:192.168.xxx.xxx 未訂閱
那是因為防火牆檔下來的原因, 我看過很多有關可以突破防火牆的通訊方式, 但都試不成功! 我自己的結論如下: 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-24 17:50:09 IP:61.222.xxx.xxx 未訂閱
非常感謝站長這麼快就有回應,我其實我並不知道自己用的IP分享器有沒有防火牆的功能在內。 現在的問題是由IP分享器內向外的實體ip建立連結都沒問題,只要連結一建立,資料就可進也可出,可是只要連結一斷就掛了,主要的原因是因為原來的Port Mapping已經不在了,就像我程式寫的,就算用同樣的port反向連回去都不行。 這在p2p方面是一個很大的問題,我的想法是一定有解決的方案,不然像很多p2p的軟體不但要傳訊息(這部份靠server轉接還可以),還要傳檔案(如果這也靠server的話那有會多可怕,server就算有再大的頻寬也不夠,好像不太可能^^|||)。 我試過很多套p2p的軟體,即使在IP分享器後執行也沒有問題,上傳下載都很正常,我一直不了解他們是怎麼做的,我一直懷疑,是不是在登入時傳了什麼特別的識別資料給server,讓別的user可以用不止ip及port的方式找到自己這台電腦,亦或是用了特別的元件或協定,希望各位高手大大能多多指點一下
jaya
初階會員


發表:9
回覆:70
積分:30
註冊:2002-05-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-26 17:29:16 IP:61.216.xxx.xxx 未訂閱
所謂的防火牆,就是用來阻隔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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-19 22:09:30 IP:61.229.xxx.xxx 未訂閱
我現在也在找這方面相關的資料, 現在的問題是出在先不說NAT對應, 目前的架構是無法從真實IP連結到虛擬IP的, 這方面的技術也實在有點難. 目前還找不到方法實作出MSN/ICQ的架構出來, 如果有人懂得話煩請解決小弟的疑惑.
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-04-26 13:52:23 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-05-13 1:38:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!