5

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

我如何使我的应用程序(它在 c# 中并使用 .net 套接字 btw)在不需要客户端端口转发的情况下工作(我不关心服务器是否需要端口转发)。

顺便说一句,它使用udp。

4

4 回答 4

5

我相信你把你的问题命名错了。您是在谈论连接到客户端的服务器,对吗?

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

与其自己编写这个,不如考虑一个专注于此的库,例如SignalR

此外 - 无论如何,UDP 对于聊天客户端来说都是一个糟糕的选择。有很多关于 UDP 数据包的笑话,但请相信我——你不会全都明白的。

于 2012-09-25T22:07:37.277 回答
2

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

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

于 2012-09-25T22:03:12.327 回答
0

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

于 2012-09-25T22:11:11.947 回答
0

如果您想通过 NAT 路由器进行通信,您可以在应用程序中使用 UPnP 设置端口转发。这就是例如 torrent 程序无需您设置端口转发即可进行通信的方式。

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

于 2012-10-10T10:32:35.090 回答