ServerBuilder :: AddListeningPort () grp c всегда возвращает нулевой TCP-порт - PullRequest
1 голос
/ 14 января 2020

Я нахожусь на Windows 10, VS2019, 64-битный GRP c v1.23.1-1 установлен через vcpkg.

С использованием класса ServerBuilder grp c. Из приведенных примеров код сервера должен выглядеть примерно так:

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 для просмотра всех прослушивающих портов подтверждает, что мое приложение нигде не прослушивает.

API AddListeningPort() задокументирован здесь .

Примеры адресов, которые я имею до сих пор пробовал:

[::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 подтверждает, что я ничего не связан с этими портами.)

Есть ли способ получить больше информации от grp c? Кажется, что нет никаких API для вызова в grpc::Server или grpc::ServerBuilder для получения кода ошибки, сообщения о состоянии и т. Д. c.


РЕДАКТИРОВАТЬ: Для людей, гуглящих вещи, связанные с grp c в будущем, я отредактировал пример кода, чтобы переместить строку std::cout вниз, так как порт недействителен до вызова BuildAndStart() ( Спасибо @Botje.)

Также определил, почему netstat на Windows не показывал мне мое приложение. Я использовал эту команду:

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 Ответ

2 голосов
/ 14 января 2020

В документации есть это, чтобы сказать о selected_port:

Если не nullptr, заполняется номером порта, связанным с grpc::Server для соответствующей конечной точки после нее успешно связан BuildAndStart(), 0 в противном случае. AddListeningPort не изменяет этот указатель.

А для addr_uri:

Для привязки к любому адресу используйте любой IPv6, т. Е. [::]:<port>, который также принимает подключения IPv4.

Попробуйте передать "[::]:12345" как addr_uri и проверять значение tcp_port только после , вызывая BuildAndStart.

...