C语言 LwIP客户端无法建立连接

vyswwuz2  于 2023-01-12  发布在  其他
关注(0)|答案(1)|浏览(218)

我想连接两块F746ZG板卡,使它们可以通过TCP进行通信。我使用的是带有netconn API的LwIP的STM实现。IP地址是通过DHCP提供的,但始终是相同的地址。另外,地址与预期值匹配。我面临的问题是客户端似乎无法建立连接。我将连接绑定到端口8880。由于我遇到了这个问题,我编写了一个调试客户端,它应该只定期向服务器发送预定义的消息。

static void tcpecho_client_thread(void const *arg)
{
  struct netconn *xNetConn = NULL;

  err_t bind_err, connect_err;

  char* b_data = "OK"; // Data to be sent
  uint16_t b_len = sizeof ( b_data );

  IP4_ADDR(&local_ip, IP_ADDR0_CLIENT, IP_ADDR1_CLIENT, IP_ADDR2_CLIENT, IP_ADDR3_CLIENT);
  IP4_ADDR(&pc_ip, IP_ADDR0_PC, IP_ADDR0_PC, IP_ADDR2_PC, IP_ADDR3_PC);

  xNetConn = netconn_new ( NETCONN_TCP );
  if (xNetConn != NULL){
      bind_err = netconn_bind ( xNetConn, &local_ip, TCP_PORT_NETCONN );

      if(bind_err == ERR_OK){

          // Try to connect to server
          for(;;){
              connect_err = netconn_connect ( xNetConn, &pc_ip, TCP_PORT_NETCONN);

              if (connect_err == ERR_OK){
                  // We are connected
                  while(1){
                      BSP_LED_On(LED1);
                      netconn_write(xNetConn, b_data, b_len, NETCONN_COPY);
                      vTaskDelay(1000); // To see the result easily in Comm Operator
                  }
              }
          }
      }else{
          // Failed to bind the connection
          BSP_LED_On(LED3);
      }
  }else{
      // Failed to allocate a new connection
      BSP_LED_On(LED3);
  }

}

当我调试这个的时候,netconn_connect从来没有设法实际连接到什么东西。因为我能够ping板并且得到响应,所以我很困惑,这里出了什么问题。我尝试使用Hercules在我的PC上设置一个TCP服务器,这样板就可以连接到那个服务器,但是那也不起作用。使用Wireshark,我可以看到对我的ping命令的响应。但我没有看到任何迹象表明该板试图连接我的PC。我已经测试了第二块板上对应的服务器,但运行正常。我可以用Hercules连接它并发送数据,因此我怀疑LwIP堆栈是否存在根本性问题。
我能猜到的是我搞砸了netconn_bind,我不是100%确定你应该绑定连接到什么IP。它目前的方式,是我如何阅读文档。对于服务器,我已经绑定到IP_ADDR_ANY。除此之外,我的实现大多与你可以在网上找到的例子相匹配(例如LwIP Wiki)。

y4ekin9u

y4ekin9u1#

我已经解决了问题,删除netconn_bind调用后,一切正常。

相关问题