eth_tcp_client_test.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #include "board.h"
  2. #include "FreeRTOS.h"
  3. #include "task.h"
  4. #include <stdio.h>
  5. #if 1 // 使用SOCKET接口
  6. #include "sockets.h"
  7. void eth_tcp_client_test(void *pvParameters)
  8. {
  9. struct sockaddr_in atk_client_addr;
  10. err_t err;
  11. int recv_data_len;
  12. int g_sock;
  13. char g_lwip_demo_recvbuf[1524];
  14. int i;
  15. printf("-------------- Lwip TCP Client Test Start! -------------\n");
  16. while (1) {
  17. sock_start:
  18. atk_client_addr.sin_family = AF_INET; /* 表示IPv4网络协议 */
  19. atk_client_addr.sin_port = htons(8087); /* 端口号 */
  20. atk_client_addr.sin_addr.s_addr = inet_addr("192.168.137.1"); /* 远程IP地址 */
  21. g_sock = socket(AF_INET, SOCK_STREAM, 0); /* 可靠数据流交付服务既是TCP协议 */
  22. memset(&(atk_client_addr.sin_zero), 0, sizeof(atk_client_addr.sin_zero));
  23. /* 连接远程IP地址 */
  24. err = connect(g_sock, (struct sockaddr *)&atk_client_addr, sizeof(struct sockaddr));
  25. if (err == -1) {
  26. printf("connect fail!\r\n");
  27. g_sock = -1;
  28. closesocket(g_sock);
  29. vTaskDelay(pdMS_TO_TICKS(100));
  30. goto sock_start;
  31. }
  32. printf("connect success!\r\n");
  33. while (1) {
  34. recv_data_len = recv(g_sock, g_lwip_demo_recvbuf, sizeof(g_lwip_demo_recvbuf), 0);
  35. if (recv_data_len <= 0 ) {
  36. closesocket(g_sock);
  37. g_sock = -1;
  38. goto sock_start;
  39. } else {
  40. printf("\nrx data:\n");
  41. for (i = 0; i < recv_data_len; i++) {
  42. printf("%c", g_lwip_demo_recvbuf[i]);
  43. }
  44. send(g_sock, g_lwip_demo_recvbuf, recv_data_len, 0);
  45. }
  46. }
  47. }
  48. }
  49. #else // 使用NETCONN接口
  50. #include "tcpip.h"
  51. #include "api.h"
  52. void eth_tcp_client_test(void *pvParameters)
  53. {
  54. static struct netconn *tcp_clientconn = NULL; /* TCP CLIENT网络连接结构体 */
  55. uint32_t data_len = 0;
  56. struct pbuf *q;
  57. err_t err,recv_err;
  58. ip4_addr_t server_ipaddr,loca_ipaddr;
  59. static uint16_t server_port,loca_port;
  60. BaseType_t lwip_err;
  61. int i;
  62. printf("-------------- Lwip TCP Client Test Start! -------------\n");
  63. server_port = 8087;
  64. IP4_ADDR(&server_ipaddr, 192, 168, 137, 1); /* 构造目的IP地址 */
  65. while (1)
  66. {
  67. tcp_clientconn = netconn_new(NETCONN_TCP); /* 创建一个TCP链接 */
  68. err = netconn_connect(tcp_clientconn,&server_ipaddr,server_port); /* 连接服务器 */
  69. if (err != ERR_OK)
  70. {
  71. printf("connect fail!\r\n");
  72. netconn_delete(tcp_clientconn); /* 返回值不等于ERR_OK,删除tcp_clientconn连接 */
  73. }
  74. else if (err == ERR_OK) /* 处理新连接的数据 */
  75. {
  76. printf("connect success!\n");
  77. struct netbuf *recvbuf;
  78. tcp_clientconn->recv_timeout = 10;
  79. netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1); /* 获取本地IP主机IP地址和端口号 */
  80. printf("port:%d\r\n",loca_port);
  81. while (1)
  82. {
  83. if ((recv_err = netconn_recv(tcp_clientconn,&recvbuf)) == ERR_OK) { /* 接收到数据 */
  84. for (q = recvbuf->p;q != NULL;q = q->next) { /* 遍历完整个pbuf链表 */
  85. err = netconn_write(tcp_clientconn, q->payload, q->len, NETCONN_COPY); /* 发送tcp_server_sentbuf中的数据 */
  86. if (err != ERR_OK) {
  87. printf("tx fail!\r\n");
  88. }
  89. for (i=0; i<q->len; i++)
  90. printf("%c", ((char *)q->payload)[i]);
  91. }
  92. netbuf_delete(recvbuf);
  93. } else if (recv_err == ERR_CLSD) { /* 关闭连接 */
  94. netconn_close(tcp_clientconn);
  95. netconn_delete(tcp_clientconn);
  96. break;
  97. }
  98. }
  99. }
  100. }
  101. }
  102. #endif