应用程序如何连接到服务器而无需端口转发?

时间:2012-09-25 21:58:49

标签: c# sockets networking udp

我刚创建了一个简单的聊天客户端,它只适用于所有客户端/服务器都在同一端口上进行端口转发。

如何使我的应用程序(在c#中使用.net套接字btw)无需客户端端口转发(我不在乎服务器是否需要端口转发)。

顺便使用udp。

4 个答案:

答案 0 :(得分:2)

我相信你错误地提出了你的问题。你在谈论连接到客户端的服务器,对吗?

如果您直接使用套接字,简短的答案是 - 您不能。答案很长,客户端必须以这样的方式注册服务器,使客户端端口保持打开状态,以便服务器可以访问它。

不要自己编写,而应考虑专注于此的库,例如SignalR

此外 - 无论如何,UDP对于聊天客户端来说是一个可怕的选择。有很多关于UDP数据包的笑话,但相信我 - 你不会得到它们。

答案 1 :(得分:1)

如果两个端点之间存在NAT和/或防火墙,则该硬件会决定两个端点是否可以通信,而不是您的程序。

但是,NAT和防火墙规则经常允许端口80和其他端口< 1024入站。通常,可以到达任何出站端口。您可以利用此功能来最小化网络拓扑阻止通信的可能性。实际上,如果查看Skype的“高级/连接”选项卡,可以看到有一个复选框,指示Skype是否可以使用端口80和443进行传入连接(此设置有时会干扰开发人员计算机上的Web服务器.. )。

答案 2 :(得分:1)

您需要一台服务器位于所有客户端连接的中间位置。你不能让一个nat框后面的客户端连接到nat框后面的另一个客户端。他们都需要连接到服务器并保持该连接打开。然后,客户端A向服务器发送消息,该消息将消息转发到客户端B上。

答案 3 :(得分:0)

如果您想通过NAT路由器进行通信,可以在应用程序中使用UPnP设置端口转发。这就是例如torrent程序可以在不设置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/...