我在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::Server
或grpc::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);
答案 0 :(得分:2)
文档中关于selected_port
的内容是这样的:
如果不是
nullptr
,则将其成功绑定到grpc::Server
后,填充相应端点绑定到BuildAndStart()
的端口号,否则返回0 。AddListeningPort
不会修改此指针。
对于addr_uri
:
要绑定到任何地址,请使用IPv6 any,即
[::]:<port>
,它也接受IPv4连接。
尝试将"[::]:12345"
作为addr_uri
传递,并且仅在调用tcp_port
之后检查<{1}}的值。