本地 TCP 服务器使用哪个地址?

Which address to use for local TCP server?

我正在编写一个系统,其中两个程序将通过 TCP 套接字进行异步通信。客户端是用 golang 编写的,但服务器可能会有所不同。我目前正在用 C# 编写一个。

在开发过程中,我使用了

conn, err := net.Dial("tcp", net.JoinHostPort("127.0.0.1", strconv.Itoa(d.port)))

对于客户端,我在服务器上做了:

this.listener = new TcpListener(IPAddress.Parse("127.0.0.1"), port);

但是,对于生产,我怀疑这可能并非在所有情况下都有效。例如,用户可能使用 IPv6。我还在服务器上尝试了 localhost,但在 Windows 上似乎与默认情况下的 127.0.0.1 不同(它必须启用,这不是一个选项)。

是否有更简单的 运行 本地 TCP 服务器的方法,应该在所有情况下都有效?

IPAddress.Loopback 就是您要找的。不过,您仍然有一个单独的 IPv6 地址 - IPAddress.IPv6Loopback。根据定义,两者分别对应 127.0.0.1::1 - 它是 IP 标准的一部分。

如果您还想让其他计算机也可以使用该服务器,IPAddress.Any(对于 IPv6,IPAddress.IPv6Any)绑定到系统上的所有 NIC。

一般来说,没有办法有一个使用 IPv4 和 IPv6 "natively" 的通用解决方案,因为这两个协议实际上是完全独立的(在 IPv6 中有 IPv4 "fallback" - 但是,它没有得到广泛支持,也没有人真正使用它)。不过,这在本地主机上不是什么大问题 - 只需尝试绑定 IPAddress.Loopback,如果失败,请尝试 IPAddress.IPv6Loopback.