2015-08-15 72 views
1

我已經做了一個服務器和客戶端應用程序相互連接,但我必須打開我的路由器端口,使其工作。沒有端口/轉發的C#P2P

有沒有我可以使用的不需要轉發的端口? 或者我可以申請一項技術?

我想保留它p2p,並避免在請求中間有一臺服務器。

回答

0

我知道可以在這裏應用的兩種技術。

技術1
UDP衝孔

UDP衝孔使用服務器作爲一個 「大廳」。
您希望參與P2P連接的客戶端首先使用UDP協議連接到服務器,客戶端因此需要打開端口(「空洞」)才能接收數據。

由於UDP是無連接協議,因此您可以將客戶端設置爲接受來自「大廳」 - 服務器和對方的數據包。

在兩個客戶端建立連接後,服務器將爲他們提供其合作伙伴的IP和匹配的「孔」端口。

在答案here中可以找到一個非常直接的實現。

技術2
通用即插即用-N-PLAY

我至少兩個的喜愛,因爲它需要客戶端的路由器具有UPnP支持,並把它啓用。

的UPnP在C#.NET可以通過包括可以輕鬆完成的NATUPNPLib COM庫
(不要忘了在參考設置來禁用「嵌入互操作類型」)

簡單的執行是這樣的:

public const int upnp_port = 3075; 

    private static UPnPNATClass pnp = new UPnPNATClass(); 
    private static IStaticPortMappingCollection mapc = pnp.StaticPortMappingCollection; 

    public static IPAddress local_ip() 
    { 
     foreach (IPAddress addr in Dns.GetHostEntry(string.Empty).AddressList) 
      if (addr.AddressFamily == AddressFamily.InterNetwork) 
       return addr; 
     return null; 
    } 

    public static void upnp_open() 
    { 
     mapc.Add(upnp_port, "UDP", upnp_port, local_ip().ToString(), true, "P2P Service Name"); 
    } 

    public static void upnp_close() 
    { 
     mapc.Remove(upnp_port, "UDP"); 
    } 

注意到,這是快速編寫的代碼,這將需要遠眺/優化,絕對是local_ip()功能,因爲它可以變得不可靠安裝了多個網絡適配器。