grpc的ServerBuilder :: AddListeningPort()始终返回TCP端口零

时间:2020-01-14 10:37:41

标签: c++ windows grpc

我在Windows 10,VS2019,通过vcpkg安装的64位grpc v1.23.1-1上。

使用grpc的ServerBuilder类。在the examples provided中,服务器代码应类似于以下内容:

const std::string server_address = "0.0.0.0:12345";
int tcp_port;
grpc::ServerBuilder builder;
builder.AddListeningPort(server_address, grpc::InsecureServerCredentials(), &tcp_port);
builder.RegisterService(&myservice);
auto server(builder.BuildAndStart());
std::cout << "port=" << tcp_port << std::endl;
server->Wait();

无论我尝试为server_address使用什么,结果tcp_port始终为零,并且调用netstat查看所有监听端口会确认我的应用程序不在任何地方监听。

here记录了AddListeningPort() API。

到目前为止我尝试过的地址示例:

[::1]:54321
dns:///[::1]43210
dns:///::1:
::1
::1:
0.0.0.0:12345
localhost
localhost:7525
127.0.0.1
127.0.0.1:9876

(我尝试了数十个随机端口号,不仅是这里的端口号,而且netstat确认我没有与那些端口绑定的任何东西。)

是否可以通过grpc获取更多信息? grpc::Servergrpc::ServerBuilder中似乎都没有任何API可以调用以获取错误代码,状态消息等。


编辑: 对于以后使用谷歌搜索与grpc有关的东西的人,我已经编辑了示例代码以将std::cout行进一步下移,因为该端口在调用BuildAndStart()之后才有效(感谢@ Botje。)

还确定了为什么Windows上的netstat没有向我显示我的应用程序。我正在使用以下命令:

netstat -q -b -n -p tcp

但是要查看IPv6 / TCPv6,我需要这样做:

netstat -q -b -n -p tcpv6

由于该地址类似于此ipv6环回:[::1]:12345

请注意,您可以多次调用此命令,所以现在我使用类似于以下几行的内容:

builder.AddListeningPort("127.0.0.1:12345", grpc::InsecureServerCredentials(), &tcp4_port);
builder.AddListeningPort("[::1]:12345", grpc::InsecureServerCredentials(), &tcp6_port);

1 个答案:

答案 0 :(得分:2)

文档中关于selected_port的内容是这样的:

如果不是nullptr,则将其成功绑定到grpc::Server 后,填充相应端点绑定到BuildAndStart()的端口号,否则返回0 。 AddListeningPort不会修改此指针。

对于addr_uri

要绑定到任何地址,请使用IPv6 any,即[::]:<port>,它也接受IPv4连接。

尝试将"[::]:12345"作为addr_uri传递,并且仅在调用tcp_port 之后检查<{1}}的值。