c++ - grpc 的 ServerBuilder::AddListeningPort() 总是返回 TCP 端口零

标签 c++ windows grpc

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

使用 grpc 的 ServerBuilder类(class)。来自 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 查看所有监听端口确认我的应用程序没有在任何地方监听。
AddListeningPort() API 已记录 here .

到目前为止我尝试过的地址示例:
[::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 确认我没有任何东西绑定(bind)到这些端口。)

有什么方法可以从 grpc 获取更多信息? grpc::Server 内似乎没有任何 API 可以调用也不是 grpc::ServerBuilder获取错误代码、状态消息等。

编辑:
对于将来在谷歌上搜索与 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);

最佳答案

文档中有关于 selected_port 的说法。 :

If not nullptr, gets populated with the port number bound to the grpc::Server for the corresponding endpoint after it is successfully bound by BuildAndStart(), 0 otherwise. AddListeningPort does not modify this pointer.



对于 addr_uri :

To bind to any address, please use IPv6 any, i.e., [::]:<port>, which also accepts IPv4 connections.



尝试通过 "[::]:12345"addr_uri并且只检查 tcp_port 的值之后 调用BuildAndStart .

关于c++ - grpc 的 ServerBuilder::AddListeningPort() 总是返回 TCP 端口零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59732082/

相关文章:

c++ - 优化非成本变量访问

c# - 当我返回某些内容时,并非所有代码路径都返回一个值

go - JSON 对我来说比 Protobuf/gRPC 快得多,Go 作为服务器,PHP 作为客户端

C++从未定义的函数访问类

c++ - 为什么 C++ 20 范围算法位于 <algorithm> 中, View 位于 <ranges> 中?

c++ - HWND 删除上面绘制的内容;无法追踪

node.js - Node JS 使用自定义 header 调用 GRPC 服务器

java - 在 maven 中使用 grpc

c++ - OpenCV:findHomography 生成一个空矩阵

java - 将多个 JFrame 中的值检索到单个 JFrame