我在通过 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 thegrpc::Server
for the corresponding endpoint after it is successfully bound byBuildAndStart()
, 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/