如何仅在 ipv4 上运行 grpc

Ami*_*deh 6 python grpc

我将在 IPv4 地址上运行 grpc 服务器,如下所示:

server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
protoc_pb2_grpc.add_ProtocServicer_to_server(StockProtocServicer(), server)
server.add_insecure_port('0.0.0.0:5000')
server.start()
Run Code Online (Sandbox Code Playgroud)

但它正在监听 IPv6。以下是 的输出lsof -i -n -P | grep 5000

python    7302             dev    6u  IPv6 224100      0t0  TCP *:5000 (LISTEN)
Run Code Online (Sandbox Code Playgroud)

我已经测试了 IPv6 上的监听,看看会发生什么,如下所示:

server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
protoc_pb2_grpc.add_ProtocServicer_to_server(UserProtocServicer(), server)
server.add_insecure_port('[::]:5000')
server.start()
Run Code Online (Sandbox Code Playgroud)

但结果是一样的:

python    7366             dev    6u  IPv6 225782      0t0  TCP *:5000 (LISTEN)
Run Code Online (Sandbox Code Playgroud)

我还尝试使用实际的 IP 地址而不是0.0.0.0

python    7392             dev    6u  IPv6 226111      0t0  TCP 192.168.1.23:5000 (LISTEN)
Run Code Online (Sandbox Code Playgroud)

尽管我可以在客户端上使用服务器的 IPv4 地址,但我只想在 IPv4 上运行服务器。我怎样才能做到这一点?

Ben*_*rth 2

TLDR:如果您使用 IPv4 地址,那么它使用的是 IPv4,而不是 IPv6。你已经得到了你想要的,尽管lsofIPv6


lsof"IPv4-mapped IPv6 address"解释

当使用 IPv4 地址时,我的 python 客户端仍然显示type为 IPv6 lsof -nP -i4TCP | grep appname

man lsof

当打开的 IPv4 网络文件的地址映射到 IPv6 地址时,打开的文件类型将为 IPv6,而不是 IPv4,并且其显示将由“6”选择,而不是“4”。

这意味着我们的应用程序使用 IPv6 网络文件/套接字,但它使用 IPv4 协议。显然,这对于应用程序(例如 python、gRPC)来说很方便处理 - 他们不必担心 IPv4 和 IPv6,他们只支持 IPv6 并且如果需要它会映射到 IPv4。

有关映射地址的更多信息,请参阅


奖金问题:

如果您只有域名(例如 google.com)并且想要使用 IPv4,而不是 IPv6,即使 IPv6 DNS 记录 ( AAAA) 存在,该怎么办: dig AAAA google.com)。

答:为此,您可以使用dig A example.com该服务器地址。不过,我正在寻找更好的方法来做到这一点。