#include "board.h" #if 1 // 使用SOCKET接口 #include "sockets.h" void eth_tcp_server_test(void *pvParameters) { struct sockaddr_in server_addr; /* 服务器地址 */ struct sockaddr_in conn_addr; /* 连接地址 */ socklen_t addr_len; /* 地址长度 */ int err; int length; int sock_fd; int g_sock_conn; char g_lwip_demo_recvbuf[1524]; int i; printf("-------------- Lwip TCP Server Test Start! -------------\n"); sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); /* 建立一个新的socket连接 */ memset(&server_addr, 0, sizeof(server_addr)); /* 将服务器地址清空 */ server_addr.sin_family = AF_INET; /* 地址家族 */ server_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* 注意转化为网络字节序 */ server_addr.sin_port = htons(8080); /* 使用SERVER_PORT指定为程序头设定的端口号 */ err = bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)); /* 建立绑定 */ if (err < 0) { /* 如果绑定失败则关闭套接字 */ printf("bind fail!\n"); closesocket(sock_fd); /* 关闭套接字 */ } err = listen(sock_fd, 4); /* 监听连接请求 */ if (err < 0) { /* 如果监听失败则关闭套接字 */ printf("listen fail!\n"); closesocket(sock_fd); /* 关闭套接字 */ } printf("wait client connect...\n"); while(1) { addr_len = sizeof(struct sockaddr_in); /* 将链接地址赋值给addr_len */ g_sock_conn = accept(sock_fd, (struct sockaddr *)&conn_addr, &addr_len); /* 对监听到的请求进行连接,状态赋值给sock_conn */ if (g_sock_conn < 0) { /* 状态小于0代表连接故障,此时关闭套接字 */ closesocket(sock_fd); } else { printf("State:Connection Successful\n"); } while (1) { memset(g_lwip_demo_recvbuf, 0, sizeof(g_lwip_demo_recvbuf)); length = recv(g_sock_conn, (unsigned int *)g_lwip_demo_recvbuf, sizeof(g_lwip_demo_recvbuf), 0); /* 将收到的数据放到接收Buff */ if (length <= 0) { goto exit; } else { printf("\nrx data:\n"); for (i = 0; i < length; i++) { printf("%c", g_lwip_demo_recvbuf[i]); } send(g_sock_conn, g_lwip_demo_recvbuf, length, 0); } } exit: if (g_sock_conn >= 0) { closesocket(g_sock_conn); g_sock_conn = -1; } } } #else // 使用NETCONN接口 #include "tcpip.h" #include "api.h" void eth_tcp_server_test(void *pvParameters) { static struct netconn *tcp_serverconn = NULL; /* TCP SERVER网络连接结构体 */ struct pbuf *q; err_t err,recv_err; uint8_t remot_addr[4]; struct netconn *newconn; static ip_addr_t ipaddr; static u16_t port; int i; printf("-------------- Lwip TCP Server Test Start! -------------\n"); /* 第一步:创建一个TCP控制块 */ tcp_serverconn = netconn_new(NETCONN_TCP); /* 创建一个TCP链接 */ /* 第二步:绑定TCP控制块、本地IP地址和端口号 */ netconn_bind(tcp_serverconn,IP_ADDR_ANY, 8080); /* 绑定端口 8080号端口 */ /* 第三步:监听 */ netconn_listen(tcp_serverconn); /* 进入监听模式 */ tcp_serverconn->recv_timeout = 10; /* 禁止阻塞线程 等待10ms */ while (1) { /* 第四步:接收连接请求 */ err = netconn_accept(tcp_serverconn,&newconn); /* 接收连接请求 */ if (err == ERR_OK) newconn->recv_timeout = 10; if (err == ERR_OK) /* 处理新连接的数据 */ { struct netbuf *recvbuf; netconn_getaddr(newconn,&ipaddr,&port,0); /* 获取远端IP地址和端口号 */ 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("clent:%d.%d.%d.%d connect, port:%d\r\n",remot_addr[0], remot_addr[1],remot_addr[2],remot_addr[3],port); while (1) { if ((recv_err = netconn_recv(newconn,&recvbuf)) == ERR_OK) { /* 接收到数据 */ printf("\nrx data:\n"); for (q = recvbuf->p;q != NULL;q = q->next) { /* 遍历完整个pbuf链表 */ err = netconn_write(newconn, q->payload, q->len, NETCONN_COPY); /* 发送g_lwip_demo_sendbuf中的数据 */ if(err != ERR_OK) { printf("tx fail!\r\n"); } for (i = 0; i < q->len; i++) printf("%c", ((char *)q->payload)[i]); } netbuf_delete(recvbuf); } else if (recv_err == ERR_CLSD) { /* 关闭连接 */ netconn_close(newconn); netconn_delete(newconn); printf("client:%d.%d.%d.%d disconnect\r\n",remot_addr[0], remot_addr[1],remot_addr[2],remot_addr[3]); break; } } } } } #endif