示例
#if 1#include <string.h>
#include "lwip/api.h"
#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
#include "lwip_comm.h"static TaskHandle_t tcp_server;
static void tcp_server_entity(void *args);void netconn_tcp_server_create_thread() {xTaskCreate((TaskFunction_t) tcp_server_entity,"tcp_server",256,NULL,10,&tcp_server);}#define TCP_SERVER_RX_BUFSIZE 1500
static struct netconn *conn;
static struct netconn *client_conn;
static uint8_t remot_addr[4] = {0};
static u16_t port;
static ip_addr_t ipaddr;
static u8_t tcp_server_recvbuf[TCP_SERVER_RX_BUFSIZE] = {0};static void tcp_server_entity(void *args) {err_t err;conn = netconn_new(NETCONN_TCP); netconn_bind(conn, IP_ADDR_ANY, 8080); netconn_listen(conn); conn->recv_timeout = 10; struct netbuf *recvbuf;u32_t data_len = 0;while (1) {handle_listen_tag:err = netconn_accept(conn, &client_conn); if (err == ERR_OK) {client_conn->recv_timeout = 10;netconn_getaddr(client_conn, &ipaddr, &port, 0); remot_addr[3] = (uint8_t) (ipaddr.addr >> 24);remot_addr[2] = (uint8_t) (ipaddr.addr >> 16);remot_addr[1] = (uint8_t) (ipaddr.addr >> 8);remot_addr[0] = (uint8_t) (ipaddr.addr);printf("主机%d.%d.%d.%d连接上服务器,主机端口号为:%d\r\n",remot_addr[0], remot_addr[1], remot_addr[2], remot_addr[3], port);handle_client_tag:err = netconn_recv(client_conn, &recvbuf);switch (err) {case ERR_OK: {portDISABLE_INTERRUPTS();memset(tcp_server_recvbuf, 0, TCP_SERVER_RX_BUFSIZE); for (struct pbuf *q = recvbuf->p; q != NULL; q = q->next) {if (q->len > (TCP_SERVER_RX_BUFSIZE - data_len)) {memcpy(tcp_server_recvbuf + data_len, q->payload, TCP_SERVER_RX_BUFSIZE - data_len);break;} else {memcpy(tcp_server_recvbuf + data_len, q->payload, q->len);}data_len += q->len;if (data_len > TCP_SERVER_RX_BUFSIZE) break;}portENABLE_INTERRUPTS();USART1_Transmits(tcp_server_recvbuf, data_len);data_len = 0; netbuf_delete(recvbuf);break;}case ERR_CLSD:case ERR_RST: {printf("主机:%d.%d.%d.%d断开与服务器的连接\r\n", remot_addr[0], remot_addr[1], remot_addr[2],remot_addr[3]);goto release_conn_tag;}default:if (g_lwipdev.link_status == LWIP_LINK_OFF) { printf("物理连线出现问题\r\n");goto release_conn_tag;}break;}goto handle_client_tag;release_conn_tag: {netconn_close(client_conn);netconn_delete(client_conn);goto handle_listen_tag;}}vTaskDelay(1000);}
}#endif