我将在 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 上运行服务器。我怎样才能做到这一点?
TLDR:如果您使用 IPv4 地址,那么它使用的是 IPv4,而不是 IPv6。你已经得到了你想要的,尽管lsof说IPv6。
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该服务器地址。不过,我正在寻找更好的方法来做到这一点。