簡體   English   中英

grpc 的 ServerBuilder::AddListeningPort() 總是返回 TCP 端口零

[英]grpc's ServerBuilder::AddListeningPort() always returns TCP port zero

我使用的是通過 vcpkg 安裝的 Windows 10、VS2019、64 位 grpc v1.23.1-1。

使用 grpc 的ServerBuilder類。 提供的示例來看,服務器代碼應該類似於:

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 記錄在此處

到目前為止我嘗試過的地址示例:

[::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獲取更多信息? 似乎沒有任何 API 可以在grpc::Servergrpc::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

如果不是nullptr ,則在它被BuildAndStart()成功綁定后,使用綁定到相應端點的grpc::Server的端口號填充,否則為 0。 AddListeningPort不修改此指針。

而對於addr_uri

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

嘗試將"[::]:12345"作為addr_uri並且僅調用BuildAndStart檢查tcp_port的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM