简体   繁体   English

chttp2_server.cc:298:断言失败:*port_num == port_temp 在同一台机器上运行服务器和客户端时(仅在 Citrix 上)

[英]chttp2_server.cc:298: assertion failed: *port_num == port_temp when running Server and Client on the same machine (only on Citrix)

We have trouble finding the cause of a problem that only occurs when running our application on a citrix server.我们很难找到仅在 citrix 服务器上运行我们的应用程序时才会出现的问题的原因。

The application is a windows GUI application starting 2 grpc services on dynamic ports - one c++ service and a the second service is a.NET component implemented in c#.该应用程序是一个 Windows GUI 应用程序,在动态端口上启动 2 个 grpc 服务 - 一个 c++ 服务和第二个服务是在 c# 中实现的 .NET 组件。 Both services run on the same machine in the same process.这两个服务在同一台机器上的同一进程中运行。 The c++ service starts first and runs fine using 127.0.0.1:0 or localhost:0. C++ 服务首先启动并使用 127.0.0.1:0 或 localhost:0 正常运行。 When the c# service starts using 127.0.0.1:0 it works on our machines and some of the customers machines but fails on their citrix servers and I have now idea what can cause this.当 c# 服务开始使用 127.0.0.1:0 时,它可以在我们的机器和一些客户的机器上运行,但在他们的 citrix 服务器上失败,我现在知道是什么导致了这种情况。

We are using grpc v1.12.0 .我们正在使用grpc v1.12.0 The assertion at the end of this code block fires and kills our process.此代码块末尾的断言会触发并终止我们的进程。

grpc_error* grpc_chttp2_server_add_port(grpc_server* server, const char* addr,
                                        grpc_channel_args* args,
                                        int* port_num) {
  grpc_resolved_addresses* resolved = nullptr;
  grpc_tcp_server* tcp_server = nullptr;
  size_t i;
  size_t count = 0;
  int port_temp;
  grpc_error* err = GRPC_ERROR_NONE;
  server_state* state = nullptr;
  grpc_error** errors = nullptr;
  size_t naddrs = 0;

  *port_num = -1;

  /* resolve address */
  err = grpc_blocking_resolve_address(addr, "https", &resolved);
  if (err != GRPC_ERROR_NONE) {
    goto error;
  }
  state = static_cast<server_state*>(gpr_zalloc(sizeof(*state)));
  GRPC_CLOSURE_INIT(&state->tcp_server_shutdown_complete,
                    tcp_server_shutdown_complete, state,
                    grpc_schedule_on_exec_ctx);
  err = grpc_tcp_server_create(&state->tcp_server_shutdown_complete, args,
                               &tcp_server);
  if (err != GRPC_ERROR_NONE) {
    goto error;
  }

  state->server = server;
  state->tcp_server = tcp_server;
  state->args = args;
  state->shutdown = true;
  gpr_mu_init(&state->mu);

  naddrs = resolved->naddrs;
  errors = static_cast<grpc_error**>(gpr_malloc(sizeof(*errors) * naddrs));
  for (i = 0; i < naddrs; i++) {
    errors[i] =
        grpc_tcp_server_add_port(tcp_server, &resolved->addrs[i], &port_temp);
    if (errors[i] == GRPC_ERROR_NONE) {
      if (*port_num == -1) {
        *port_num = port_temp;
      } else {
        GPR_ASSERT(*port_num == port_temp);
      }
      count++;
    }
  }

Even with GRPC_VERBOSITY=debug and GRPC_TRACE=all I can't see any error nor useful hints.即使使用 GRPC_VERBOSITY=debug 和 GRPC_TRACE=all 我也看不到任何错误或有用的提示。

The log then only shows this:日志然后只显示这一点:

I0727 10:10:51.045681 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\lib\surface\init.cc:155: grpc_init(void)
I0727 10:10:51.045681 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\lib\surface\server.cc:944: grpc_server_create(0000009E5A5AA470, 0000000000000000)
I0727 10:10:51.045681 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\lib\surface\server.cc:930: grpc_server_register_completion_queue(server=0000009E5A40CAA0, cq=0000009E59D52FD0, reserved=0000000000000000)
I0727 10:10:51.045681 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\lib\surface\server.cc:930: grpc_server_register_completion_queue(server=0000009E5A40CAA0, cq=0000009E59D53490, reserved=0000000000000000)
I0727 10:10:51.045681 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\lib\surface\server.cc:930: grpc_server_register_completion_queue(server=0000009E5A40CAA0, cq=0000009E59D52D70, reserved=0000000000000000)
I0727 10:10:51.045681 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\lib\surface\server.cc:930: grpc_server_register_completion_queue(server=0000009E5A40CAA0, cq=0000009E59D536F0, reserved=0000000000000000)
I0727 10:10:51.061313 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\ext\transport\chttp2\server\insecure\server_chttp2.cc:34: grpc_server_add_insecure_http2_port(server=0000009E5A40CAA0, addr=localhost:0)
E0727 10:10:51.061313 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\ext\transport\chttp2\server\chttp2_server.cc:298: assertion failed: *port_num == port_temp

Any hint of a possible cause would be very welcome.任何可能原因的暗示都将非常受欢迎。

After adding some more log messages to grpc I can see that there are actually 2 different addresses with different ports involved ([::1]:20530 and [::ffff:127.0.0.1]:20532)在向 grpc 添加更多日志消息后,我可以看到实际上有 2 个不同的地址涉及不同的端口([::1]:20530 和 [::ffff:127.0.0.1]:20532)

I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\ext\transport\chttp2\server\insecure\server_chttp2.cc:34: grpc_server_add_insecure_http2_port(server=000000DA0EF73120, addr=localhost:0)
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\ext\transport\chttp2\server\chttp2_server.cc:291: WARNING: Zk, grpc_chttp2_server_add_port: naddrs = 2
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\ext\transport\chttp2\server\chttp2_server.cc:298: WARNING: Zk, before grpc_tcp_server_add_port: port_temp = 484827504, resolved->addrs[0] = [::1]:0
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\lib\iomgr\tcp_server_windows.cc:501: Warning: Zk: grpc_sockaddr_to_v4mapped returned false
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\lib\iomgr\tcp_server_windows.cc:513: Warning: Zk: grpc_sockaddr_is_wildcard returned false
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\lib\iomgr\tcp_server_windows.cc:194: Warning: Zk: before grpc_tcp_prepare_socket
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\lib\iomgr\tcp_server_windows.cc:200: Warning: Zk: before bind
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\lib\iomgr\tcp_server_windows.cc:207: Warning: Zk: before listen
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\lib\iomgr\tcp_server_windows.cc:213: Warning: Zk: before getsockname
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\lib\iomgr\tcp_server_windows.cc:222: Warning: Zk: before grpc_sockaddr_get_port
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\lib\iomgr\tcp_server_windows.cc:226: Warning: Zk: sockname_temp: [::1]:20530
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\ext\transport\chttp2\server\chttp2_server.cc:306: WARNING: Zk, after grpc_tcp_server_add_port: port_temp = 20530, errors[i] = 0
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\ext\transport\chttp2\server\chttp2_server.cc:298: WARNING: Zk, before grpc_tcp_server_add_port: port_temp = 20530, resolved->addrs[1] = 127.0.0.1:0
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\lib\iomgr\tcp_server_windows.cc:496: Warning: Zk: grpc_sockaddr_to_v4mapped returned true
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\lib\iomgr\tcp_server_windows.cc:513: Warning: Zk: grpc_sockaddr_is_wildcard returned false
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\lib\iomgr\tcp_server_windows.cc:194: Warning: Zk: before grpc_tcp_prepare_socket
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\lib\iomgr\tcp_server_windows.cc:200: Warning: Zk: before bind
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\lib\iomgr\tcp_server_windows.cc:207: Warning: Zk: before listen
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\lib\iomgr\tcp_server_windows.cc:213: Warning: Zk: before getsockname
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\lib\iomgr\tcp_server_windows.cc:222: Warning: Zk: before grpc_sockaddr_get_port
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\lib\iomgr\tcp_server_windows.cc:226: Warning: Zk: sockname_temp: [::ffff:127.0.0.1]:20532
I0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\ext\transport\chttp2\server\chttp2_server.cc:306: WARNING: Zk, after grpc_tcp_server_add_port: port_temp = 20532, errors[i] = 0
E0727 14:22:16.875600 0 E:\grpc-v1.12.0\grpc\src\core\ext\transport\chttp2\server\chttp2_server.cc:313: assertion failed: *port_num == port_temp

The reason was that we were using localhost for the .NET grpc service instead of 127.0.0.1 .原因是我们为 .NET grpc 服务使用localhost而不是127.0.0.1

ports = new ServerPort("localhost", 0, ServerCredentials.Insecure);

Grpc_blocking_resolve_address thus provided an address for ipv4 and ipv6.因此,grpc_blocking_resolve_address 为 ipv4 和 ipv6 提供了地址。 grpc_tcp_server_add_port was then called for both addresses and delivered 2 different ports that led to the assertion.然后为两个地址调用 grpc_tcp_server_add_port 并传递导致断言的 2 个不同端口。 Unfortunately there were no diagnostic options in Grpc here.不幸的是,这里的 Grpc 中没有诊断选项。

After changing localhost to 127.0.0.1 out application works fine.将 localhost 更改为 127.0.0.1 后,应用程序工作正常。

ports = new ServerPort("127.0.0.1", 0, ServerCredentials.Insecure);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如果客户端的Udp端口在一个端口上打入服务器,我是否可以假设它在发送到服务器上的另一个端口时将从同一端口发送? - If a client Udp port punches to a server on one port, can I assume it will send from same port if it sends to a different port on the server? 当服务器和客户端在同一台计算机上时,收听广播 - Listening to broadcasts when server and client are on the same machine 无法将在端口上运行的 SignalR 客户端连接到 .NET Core 2.2 服务器 - Cannot connect SignalR client running on a port to a .NET Core 2.2 server 当另一个客户端(连接到同一端口)发送数据时,服务器端TcpClient的stream.read不获取数据 - Server side TcpClient's stream.read gets no data when a different client (connected to the same port) sends data 客户端服务器应用程序upnp /端口转发问题 - client server app upnp / port forward question 运行多个服务器网站时出现端口错误 - Port Error while running multiple server website DotNet 在同一本地服务器上显示不同的端口 - DotNet display different port on same local server Visual Studio开发服务器使用机器ip自动重定向到默认端口 - visual studio development server automatically redirects to default port with machine ip 当客户端和服务器在同一台计算机上时,登录尝试失败 - The logon attempt failed when client and server are on the same computer 测试客户端和服务器套接字应用程序时如何指定有效端口? - How do I specify a valid port when testing a client and server socket application?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM