我刚创建了一个简单的聊天客户端,它只适用于所有客户端/服务器都在同一端口上进行端口转发。
如何使我的应用程序(在c#中使用.net套接字btw)无需客户端端口转发(我不在乎服务器是否需要端口转发)。
顺便使用udp。
答案 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组件的引用
获取所有现有端口映射的列表
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");