2012-09-25 22 views
4

我剛剛創建了一個簡單的聊天客戶端,只有當所有的客戶端/服務器都在同一端口上進行端口轉發時,它才能正常工作。應用程序如何連接到服務器而不需要使用portforwarding?

如何讓我的應用程序(順便說一句它在C#和.NET使用插座)工作,而客戶端的需求端口轉發的(我不關心,如果服務器需要端口轉發)。

它使用udp的方式。

回答

1

您需要一個位於所有客戶端連接到的中間的服務器。你不能有一個nat盒子後面的客戶端連接到nat盒子後面的另一個客戶端。他們都需要連接到服務器並保持連接打開。客戶端A,然後將消息發送到如果你想通過NAT路由器進行通信的消息轉發到客戶端B.

+0

這不100%t後悔。您可以在nat後面的兩個主機之間創建連接。一種方法是同時開始將兩個主機的IP數據包發送到互聯網IP地址。 – Logman

1

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

然而,NAT和防火牆規則常常允許使用80端口等港口< 1024入站。通常,可以到達任何出站端口。您可以利用這一點來儘量減少網絡拓撲將阻止通信的可能性。事實上,如果您查看Skype的高級/連接選項卡,可以看到有一個複選框,指示Skype是否可以將端口80和443用於傳入連接(此設置有時會干擾開發人員計算機上的Web服務器.. )。

2

我相信你的題目是錯的。你在談論連接到客戶端的服務器,對吧?

如果您直接使用套接字,簡短的答案是 - 您不能。漫長的回答是,客戶端必須以服務器端註冊的方式註冊,以便服務器能夠訪問它。

而不是寫這個你自己,考慮的重點是這個圖書館,如SignalR

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

+1

http://instantrimshot.com/ –

0

的服務器,你可以從你的應用程序中設置使用UPnP您portforwarding。這就是例如洪流程序可以溝通,而無需設置portforwarding。

在.NET中你可以使用NATUPnP 1.0 Type Library(NATUPNP.DLL)COM組件,它是Windows的一部分,(自Windows XP)。

添加一個引用到COM組件

adding com component

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

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/...

相關問題