我已經做了一個服務器和客戶端應用程序相互連接,但我必須打開我的路由器端口,使其工作。沒有端口/轉發的C#P2P
有沒有我可以使用的不需要轉發的端口? 或者我可以申請一項技術?
我想保留它p2p,並避免在請求中間有一臺服務器。
我已經做了一個服務器和客戶端應用程序相互連接,但我必須打開我的路由器端口,使其工作。沒有端口/轉發的C#P2P
有沒有我可以使用的不需要轉發的端口? 或者我可以申請一項技術?
我想保留它p2p,並避免在請求中間有一臺服務器。
我知道可以在這裏應用的兩種技術。
技術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()
功能,因爲它可以變得不可靠安裝了多個網絡適配器。