我借助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);
}
您建议进行哪种修改?