| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- #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
|