LWIP更改客户端

时间:2020-10-20 13:29:28

标签: tcp embedded lwip

我借助lwip库在STM32F746发现板上创建了一个TCP / IP服务器。它与一个客户端(一个端口,一个IP)配合使用时效果很好,但是在更改客户端(更改IP和端口)时,服务器无法连接到新客户端。这是我的代码;

extern struct netif gnetif;
extern ip4_addr_t netmask;
extern ip4_addr_t gw;

char tcp_rx_buf[64];

struct tcp_pcb *tcp_controller;


/*
 * @parameter : TCP communication protocol controller struct.
 * @retval    : none.
 * @brief     : This function closes TCP connection. All motorized systems is closed in respect.
 */

 static void TCP_Close_Connection(struct tcp_pcb *pcb)
 {
      tcp_arg(pcb, NULL);
      tcp_sent(pcb, NULL);
      tcp_recv(pcb, NULL);
      tcp_close(pcb);
 }

 /*
  * @parameter1 : Unused argument.
  * @parameter2 : TCP communication protocol controller struct.
  * @parameter3 : TCP buffer control struct.
  * @parameter4 : Error state checking struct.
  * @retval     : Function error state returnig value.
  * @brief      : This function Recieves data via TCP/IP protocol and copies into global buffer.
  * */

   static err_t TCP_Recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
   {

   LWIP_UNUSED_ARG(arg);
   uint32_t len;
   char *pc;

   if ( (err == ERR_OK) && (p != NULL) )
   {

        tcp_recved(pcb, p->tot_len);

        pc=(char *)p->payload;

        len =p->tot_len;

        memcpy(tcp_rx_buf,pc,len);

        pbuf_free(p);

        if ( len > tcp_sndbuf(pcb) )
        {
            len = tcp_sndbuf(pcb);
        }
  }
  else
  {
        pbuf_free(p);
  }

  if ( (err == ERR_OK) && (p == NULL) )
  {
        TCP_Close_Connection(pcb);
  }

  return ERR_OK;
  }

  /*
   * @parameter1 : Unused argument.
   * @parameter2 : TCP communication protocol controller struct.
   * @parameter3 : Error state checking struct.
   * @retval     : Function error state returnig value.
   * @brief      : This function accepts requests from TCP clients.
   */

   static err_t TCP_Accept(void *arg, struct tcp_pcb *pcb, err_t err)
   {
      LWIP_UNUSED_ARG(arg);
      LWIP_UNUSED_ARG(err);

  tcp_setprio(pcb, TCP_PRIO_MIN);
  tcp_recv(pcb, TCP_Recv);
  tcp_err(pcb, NULL);
  tcp_poll(pcb, NULL, 4);

  return ERR_OK;
  }

  /*
   * WARNING : THESE FUNCTIONS WILL BE MODIFIED IN FUTURE.
   */

   void TCP_Server_Init()
   {
      tcp_controller = tcp_new();
      tcp_bind(tcp_controller, IP_ADDR_ANY, 80);
   }

   void TCP_Server_Runtime_Task()
   {
     tcp_controller = tcp_listen(tcp_controller);
     tcp_accept(tcp_controller, TCP_Accept);
   }

   void TCP_Server_Change_Client(const ip_addr_t *ipaddr, u16_t port)
   {
      tcp_controller = tcp_new();
      tcp_bind(tcp_controller, ipaddr, port);
   }

您建议进行哪种修改?

0 个答案:

没有答案