Я нахожусь на 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);