#include "board.h" #include "FreeRTOS.h" #include "task.h" #include #if 1 // 使用SOCKET接口 #include "sockets.h" void eth_tcp_client_test(void *pvParameters) { struct sockaddr_in atk_client_addr; err_t err; int recv_data_len; int g_sock; char g_lwip_demo_recvbuf[1524]; int i; printf("-------------- Lwip TCP Client Test Start! -------------\n"); while (1) { sock_start: atk_client_addr.sin_family = AF_INET; /* 表示IPv4网络协议 */ atk_client_addr.sin_port = htons(8087); /* 端口号 */ atk_client_addr.sin_addr.s_addr = inet_addr("192.168.137.1"); /* 远程IP地址 */ g_sock = socket(AF_INET, SOCK_STREAM, 0); /* 可靠数据流交付服务既是TCP协议 */ memset(&(atk_client_addr.sin_zero), 0, sizeof(atk_client_addr.sin_zero)); /* 连接远程IP地址 */ err = connect(g_sock, (struct sockaddr *)&atk_client_addr, sizeof(struct sockaddr)); if (err == -1) { printf("connect fail!\r\n"); g_sock = -1; closesocket(g_sock); vTaskDelay(pdMS_TO_TICKS(100)); goto sock_start; } printf("connect success!\r\n"); while (1) { recv_data_len = recv(g_sock, g_lwip_demo_recvbuf, sizeof(g_lwip_demo_recvbuf), 0); if (recv_data_len <= 0 ) { closesocket(g_sock); g_sock = -1; goto sock_start; } else { printf("\nrx data:\n"); for (i = 0; i < recv_data_len; i++) { printf("%c", g_lwip_demo_recvbuf[i]); } send(g_sock, g_lwip_demo_recvbuf, recv_data_len, 0); } } } } #else // 使用NETCONN接口 #include "tcpip.h" #include "api.h" void eth_tcp_client_test(void *pvParameters) { static struct netconn *tcp_clientconn = NULL; /* TCP CLIENT网络连接结构体 */ uint32_t data_len = 0; struct pbuf *q; err_t err,recv_err; ip4_addr_t server_ipaddr,loca_ipaddr; static uint16_t server_port,loca_port; BaseType_t lwip_err; int i; printf("-------------- Lwip TCP Client Test Start! -------------\n"); server_port = 8087; IP4_ADDR(&server_ipaddr, 192, 168, 137, 1); /* 构造目的IP地址 */ while (1) { tcp_clientconn = netconn_new(NETCONN_TCP); /* 创建一个TCP链接 */ err = netconn_connect(tcp_clientconn,&server_ipaddr,server_port); /* 连接服务器 */ if (err != ERR_OK) { printf("connect fail!\r\n"); netconn_delete(tcp_clientconn); /* 返回值不等于ERR_OK,删除tcp_clientconn连接 */ } else if (err == ERR_OK) /* 处理新连接的数据 */ { printf("connect success!\n"); struct netbuf *recvbuf; tcp_clientconn->recv_timeout = 10; netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1); /* 获取本地IP主机IP地址和端口号 */ printf("port:%d\r\n",loca_port); while (1) { if ((recv_err = netconn_recv(tcp_clientconn,&recvbuf)) == ERR_OK) { /* 接收到数据 */ for (q = recvbuf->p;q != NULL;q = q->next) { /* 遍历完整个pbuf链表 */ err = netconn_write(tcp_clientconn, q->payload, q->len, NETCONN_COPY); /* 发送tcp_server_sentbuf中的数据 */ if (err != ERR_OK) { printf("tx fail!\r\n"); } for (i=0; ilen; i++) printf("%c", ((char *)q->payload)[i]); } netbuf_delete(recvbuf); } else if (recv_err == ERR_CLSD) { /* 关闭连接 */ netconn_close(tcp_clientconn); netconn_delete(tcp_clientconn); break; } } } } } #endif