eth_tcp_server_test.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include "board.h"
  2. #if 1 // 使用SOCKET接口
  3. #include "sockets.h"
  4. void eth_tcp_server_test(void *pvParameters)
  5. {
  6. struct sockaddr_in server_addr; /* 服务器地址 */
  7. struct sockaddr_in conn_addr; /* 连接地址 */
  8. socklen_t addr_len; /* 地址长度 */
  9. int err;
  10. int length;
  11. int sock_fd;
  12. int g_sock_conn;
  13. char g_lwip_demo_recvbuf[1524];
  14. int i;
  15. printf("-------------- Lwip TCP Server Test Start! -------------\n");
  16. sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); /* 建立一个新的socket连接 */
  17. memset(&server_addr, 0, sizeof(server_addr)); /* 将服务器地址清空 */
  18. server_addr.sin_family = AF_INET; /* 地址家族 */
  19. server_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* 注意转化为网络字节序 */
  20. server_addr.sin_port = htons(8080); /* 使用SERVER_PORT指定为程序头设定的端口号 */
  21. err = bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)); /* 建立绑定 */
  22. if (err < 0) { /* 如果绑定失败则关闭套接字 */
  23. printf("bind fail!\n");
  24. closesocket(sock_fd); /* 关闭套接字 */
  25. }
  26. err = listen(sock_fd, 4); /* 监听连接请求 */
  27. if (err < 0) { /* 如果监听失败则关闭套接字 */
  28. printf("listen fail!\n");
  29. closesocket(sock_fd); /* 关闭套接字 */
  30. }
  31. printf("wait client connect...\n");
  32. while(1) {
  33. addr_len = sizeof(struct sockaddr_in); /* 将链接地址赋值给addr_len */
  34. g_sock_conn = accept(sock_fd, (struct sockaddr *)&conn_addr, &addr_len); /* 对监听到的请求进行连接,状态赋值给sock_conn */
  35. if (g_sock_conn < 0) { /* 状态小于0代表连接故障,此时关闭套接字 */
  36. closesocket(sock_fd);
  37. } else {
  38. printf("State:Connection Successful\n");
  39. }
  40. while (1) {
  41. memset(g_lwip_demo_recvbuf, 0, sizeof(g_lwip_demo_recvbuf));
  42. length = recv(g_sock_conn, (unsigned int *)g_lwip_demo_recvbuf, sizeof(g_lwip_demo_recvbuf), 0); /* 将收到的数据放到接收Buff */
  43. if (length <= 0) {
  44. goto exit;
  45. } else {
  46. printf("\nrx data:\n");
  47. for (i = 0; i < length; i++) {
  48. printf("%c", g_lwip_demo_recvbuf[i]);
  49. }
  50. send(g_sock_conn, g_lwip_demo_recvbuf, length, 0);
  51. }
  52. }
  53. exit:
  54. if (g_sock_conn >= 0) {
  55. closesocket(g_sock_conn);
  56. g_sock_conn = -1;
  57. }
  58. }
  59. }
  60. #else // 使用NETCONN接口
  61. #include "tcpip.h"
  62. #include "api.h"
  63. void eth_tcp_server_test(void *pvParameters)
  64. {
  65. static struct netconn *tcp_serverconn = NULL; /* TCP SERVER网络连接结构体 */
  66. struct pbuf *q;
  67. err_t err,recv_err;
  68. uint8_t remot_addr[4];
  69. struct netconn *newconn;
  70. static ip_addr_t ipaddr;
  71. static u16_t port;
  72. int i;
  73. printf("-------------- Lwip TCP Server Test Start! -------------\n");
  74. /* 第一步:创建一个TCP控制块 */
  75. tcp_serverconn = netconn_new(NETCONN_TCP); /* 创建一个TCP链接 */
  76. /* 第二步:绑定TCP控制块、本地IP地址和端口号 */
  77. netconn_bind(tcp_serverconn,IP_ADDR_ANY, 8080); /* 绑定端口 8080号端口 */
  78. /* 第三步:监听 */
  79. netconn_listen(tcp_serverconn); /* 进入监听模式 */
  80. tcp_serverconn->recv_timeout = 10; /* 禁止阻塞线程 等待10ms */
  81. while (1)
  82. {
  83. /* 第四步:接收连接请求 */
  84. err = netconn_accept(tcp_serverconn,&newconn); /* 接收连接请求 */
  85. if (err == ERR_OK) newconn->recv_timeout = 10;
  86. if (err == ERR_OK) /* 处理新连接的数据 */
  87. {
  88. struct netbuf *recvbuf;
  89. netconn_getaddr(newconn,&ipaddr,&port,0); /* 获取远端IP地址和端口号 */
  90. remot_addr[3] = (uint8_t)(ipaddr.addr >> 24);
  91. remot_addr[2] = (uint8_t)(ipaddr.addr>> 16);
  92. remot_addr[1] = (uint8_t)(ipaddr.addr >> 8);
  93. remot_addr[0] = (uint8_t)(ipaddr.addr);
  94. printf("clent:%d.%d.%d.%d connect, port:%d\r\n",remot_addr[0], remot_addr[1],remot_addr[2],remot_addr[3],port);
  95. while (1)
  96. {
  97. if ((recv_err = netconn_recv(newconn,&recvbuf)) == ERR_OK) { /* 接收到数据 */
  98. printf("\nrx data:\n");
  99. for (q = recvbuf->p;q != NULL;q = q->next) { /* 遍历完整个pbuf链表 */
  100. err = netconn_write(newconn, q->payload, q->len, NETCONN_COPY); /* 发送g_lwip_demo_sendbuf中的数据 */
  101. if(err != ERR_OK) {
  102. printf("tx fail!\r\n");
  103. }
  104. for (i = 0; i < q->len; i++)
  105. printf("%c", ((char *)q->payload)[i]);
  106. }
  107. netbuf_delete(recvbuf);
  108. } else if (recv_err == ERR_CLSD) { /* 关闭连接 */
  109. netconn_close(newconn);
  110. netconn_delete(newconn);
  111. printf("client:%d.%d.%d.%d disconnect\r\n",remot_addr[0], remot_addr[1],remot_addr[2],remot_addr[3]);
  112. break;
  113. }
  114. }
  115. }
  116. }
  117. }
  118. #endif