eth_udp_test.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include "board.h"
  2. #include <stdio.h>
  3. // UDP实验任务
  4. #if 1 // 使用SOCKET接口
  5. #include "sockets.h"
  6. void eth_udp_test(void *pvParameters)
  7. {
  8. int sock = -1;
  9. char recv_data[1524];
  10. struct sockaddr_in udp_addr,seraddr;
  11. int recv_data_len;
  12. socklen_t addrlen;
  13. int i;
  14. printf("-------------- Lwip TCP UDP Test Start! -------------\n");
  15. while (1) {
  16. sock = socket(AF_INET, SOCK_DGRAM, 0);
  17. if (sock < 0)
  18. {
  19. printf("Socket error\n");
  20. goto __exit;
  21. }
  22. udp_addr.sin_family = AF_INET;
  23. udp_addr.sin_addr.s_addr = INADDR_ANY;
  24. udp_addr.sin_port = htons(8088);
  25. memset(&(udp_addr.sin_zero), 0, sizeof(udp_addr.sin_zero));
  26. if (bind(sock, (struct sockaddr *)&udp_addr, sizeof(struct sockaddr)) == -1) {
  27. printf("Unable to bind\n");
  28. goto __exit;
  29. }
  30. while (1) {
  31. recv_data_len=recvfrom(sock, recv_data,
  32. sizeof(recv_data), 0,
  33. (struct sockaddr*)&seraddr,
  34. &addrlen);
  35. /*显示发送端的IP地址*/
  36. printf("\r\nreceive from %s\n",inet_ntoa(seraddr.sin_addr));
  37. /*显示发送端发来的字串*/
  38. for (i = 0; i < recv_data_len; i++) {
  39. printf("%c", recv_data[i]);
  40. }
  41. /*将字串返回给发送端*/
  42. sendto(sock,recv_data,
  43. recv_data_len,0,
  44. (struct sockaddr*)&seraddr,
  45. addrlen);
  46. }
  47. __exit:
  48. if (sock >= 0) closesocket(sock);
  49. if (recv_data) free(recv_data);
  50. }
  51. }
  52. #else // 使用NETCONN接口
  53. #include "tcpip.h"
  54. #include "api.h"
  55. void eth_udp_test(void *pvParameters)
  56. {
  57. err_t err;
  58. static struct netconn *udpconn;
  59. static struct netbuf *sentbuf;
  60. static struct netbuf *recvbuf;
  61. ip_addr_t destipaddr;
  62. struct pbuf *q;
  63. int i;
  64. char *g_lwip_demo_sendbuf = "UDP TX TEST!0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
  65. printf("-------------- Lwip TCP UDP Test Start! -------------\n");
  66. /* 第一步:创建udp控制块 */
  67. udpconn = netconn_new(NETCONN_UDP);
  68. /* 定义接收超时时间 */
  69. udpconn->recv_timeout = 10;
  70. if (udpconn != NULL) /* 判断创建控制块释放成功 */
  71. {
  72. /* 第二步:绑定控制块、本地IP和端口 */
  73. err = netconn_bind(udpconn, IP_ADDR_ANY, 8080);
  74. /* 构造目的IP地址 */
  75. IP4_ADDR(&destipaddr, 192, 168, 137, 1);
  76. /* 第三步:连接或者建立对话框 */
  77. netconn_connect(udpconn, &destipaddr, 8086); /* 连接到远端主机 */
  78. if (err == ERR_OK) { /* 绑定完成 */
  79. sentbuf = netbuf_new();
  80. netbuf_alloc(sentbuf, strlen((char *)g_lwip_demo_sendbuf));
  81. memcpy(sentbuf->p->payload, (void *)g_lwip_demo_sendbuf, strlen((char *)g_lwip_demo_sendbuf));
  82. err = netconn_send(udpconn, sentbuf); /* 将netbuf中的数据发送出去 */
  83. if (err != ERR_OK)
  84. {
  85. printf("发送失败\r\n");
  86. netbuf_delete(sentbuf); /* 删除buf */
  87. }
  88. netbuf_delete(sentbuf); /* 删除buf */
  89. while(1) {
  90. netconn_recv(udpconn, &recvbuf);
  91. if (recvbuf != NULL) { /* 接收到数据 */
  92. printf("\nudp rx:\n");
  93. for (q = recvbuf->p; q != NULL; q = q->next) { /* 遍历完整个pbuf链表 */
  94. for (i=0; i<q->len; i++)
  95. printf("%c", ((char *)q->payload)[i]);
  96. }
  97. err = netconn_send(udpconn, recvbuf); /* 将netbuf中的数据发送出去 */
  98. if (err != ERR_OK) {
  99. printf("发送失败\r\n");
  100. }
  101. netbuf_delete(recvbuf); /* 删除buf */
  102. }
  103. }
  104. vTaskDelay(10);
  105. }
  106. else printf("UDP绑定失败\r\n");
  107. }
  108. else printf("UDP连接创建失败\r\n");
  109. }
  110. #endif