簡體   English   中英

應用程序如何連接到服務器而無需端口轉發?

[英]how do applications connect to servers without the need of portforwarding?

我剛剛創建了一個簡單的聊天客戶端,它只適用於所有客戶端/服務器在同一端口上進行端口轉發的情況。

如何使我的應用程序(它在c#中使用.net套接字btw)工作而不需要為客戶端進行端口轉發(我不在乎服務器是否需要端口轉發)。

它順便使用udp。

我相信你的問題錯了。 你在談論連接到客戶端的服務器,對嗎?

如果你直接使用套接字,簡短的答案是 - 你做不到。 答案很長,客戶端必須以這樣的方式注冊服務器,即客戶端端口保持打開狀態,以便服務器可以訪問它。

不要自己編寫,而應考慮專注於此的庫,例如SignalR

此外 - 無論如何,UDP對於聊天客戶端來說是一個可怕的選擇。 有很多關於UDP數據包的笑話,但請相信我 - 你不會得到它們。

如果兩個端點之間存在NAT和/或防火牆,則該硬件會確定兩個端點是否可以通信,而不是您的程序。

但是,NAT和防火牆規則經常允許端口80和其他端口<1024入站。 通常,可以到達任何出站端口。 您可以利用此功能來最小化網絡拓撲阻止通信的可能性。 實際上,如果查看Skype的“高級/連接”選項卡,可以看到有一個復選框,指示Skype是否可以使用端口80和443進行傳入連接(此設置有時會干擾開發人員計算機上的Web服務器.. )。

您需要一個服務器位於所有客戶端連接的中間位置。 你不能讓一個nat框后面的客戶端連接到nat框后面的另一個客戶端。 他們都需要連接到服務器並保持該連接打開。 然后,客戶端A向服務器發送消息,該消息將消息轉發到客戶端B.

如果要通過NAT路由器進行通信,可以在應用程序中使用UPnP設置端口轉發。 這是例如torrent程序可以在不設置portforwarding的情況下進行通信的方式。

在.net中,您可以使用NATUPnP 1.0類型庫 (NATUPNP.DLL)COM組件,它是Windows的一部分(從Windows XP開始)。

添加對com組件的引用

添加com組件

獲取所有現有端口映射的列表

NATUPNPLib.UPnPNATClass upnpnat = new NATUPNPLib.UPnPNATClass();
NATUPNPLib.IStaticPortMappingCollection mappings = upnpnat.StaticPortMappingCollection;

遍歷所有映射

foreach(NATUPNPLib.IStaticPortMapping portMapping in mappings)
{
    // do something with the port mapping, such as displaying it in a listbox
}

添加新的端口映射

// Here's an example of opening up TCP Port 80 to forward to a specific Computer on the Private Network
mappings.Add(80, "TCP", 80, "192.168.1.100", true, "Local Web Server");

// Here's an example of forwarding the UDP traffic of Internet Port 80 to Port 8080 on a Computer on the Private Network
mappings.Add(80, "UDP", 8080, "192.168.1.100", true, "Local Web Server");

刪除端口映射

// Remove TCP forwarding for Port 80
mappings.Remove(80, "TCP");

// Remove UDP forwarding for Port 8080
mappings.Remove(8080, "UDP");

資料來源: http://pietschsoft.com / ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM