我剛剛創建了一個簡單的聊天客戶端,只有當所有的客戶端/服務器都在同一端口上進行端口轉發時,它才能正常工作。應用程序如何連接到服務器而不需要使用portforwarding?
如何讓我的應用程序(順便說一句它在C#和.NET使用插座)工作,而客戶端的需求端口轉發的(我不關心,如果服務器需要端口轉發)。
它使用udp的方式。
我剛剛創建了一個簡單的聊天客戶端,只有當所有的客戶端/服務器都在同一端口上進行端口轉發時,它才能正常工作。應用程序如何連接到服務器而不需要使用portforwarding?
如何讓我的應用程序(順便說一句它在C#和.NET使用插座)工作,而客戶端的需求端口轉發的(我不關心,如果服務器需要端口轉發)。
它使用udp的方式。
您需要一個位於所有客戶端連接到的中間的服務器。你不能有一個nat盒子後面的客戶端連接到nat盒子後面的另一個客戶端。他們都需要連接到服務器並保持連接打開。客戶端A,然後將消息發送到如果你想通過NAT路由器進行通信的消息轉發到客戶端B.
如果在兩個端點之間存在NAT和/或防火牆,則該硬件決定兩個端點是否可以通信,而不是您的程序。
然而,NAT和防火牆規則常常允許使用80端口等港口< 1024入站。通常,可以到達任何出站端口。您可以利用這一點來儘量減少網絡拓撲將阻止通信的可能性。事實上,如果您查看Skype的高級/連接選項卡,可以看到有一個複選框,指示Skype是否可以將端口80和443用於傳入連接(此設置有時會干擾開發人員計算機上的Web服務器.. )。
我相信你的題目是錯的。你在談論連接到客戶端的服務器,對吧?
如果您直接使用套接字,簡短的答案是 - 您不能。漫長的回答是,客戶端必須以服務器端註冊的方式註冊,以便服務器能夠訪問它。
而不是寫這個你自己,考慮的重點是這個圖書館,如SignalR。
此外 - 無論如何UDP是一個聊天客戶端的可怕選擇。關於UDP數據包有很多笑話,但請相信我 - 你不會把它們全部拿出來。
http://instantrimshot.com/ –
的服務器,你可以從你的應用程序中設置使用UPnP您portforwarding。這就是例如洪流程序可以溝通,而無需設置portforwarding。
在.NET中你可以使用NATUPnP 1.0 Type Library(NATUPNP.DLL)COM組件,它是Windows的一部分,(自Windows XP)。
添加一個引用到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");
這不100%t後悔。您可以在nat後面的兩個主機之間創建連接。一種方法是同時開始將兩個主機的IP數據包發送到互聯網IP地址。 – Logman