1
0

udpclient6.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include <rtthread.h>
  2. #include <lwip/netdb.h>
  3. #include <lwip/sockets.h>
  4. #define SERV_PORT 22345
  5. #define SERVADDR "4006:e024:680:c6e:223:8bff:fe59:de90"
  6. #define BUF_SIZE 1024
  7. static const char send_data[] = "This is UDP Client from RT-Thread.";
  8. void udpclient6(void)
  9. {
  10. char *recv_data;
  11. int sockfd;
  12. struct sockaddr_in6 server_addr6, client_addr6;
  13. socklen_t clientlen;
  14. recv_data = rt_malloc(BUF_SIZE);
  15. if(recv_data == RT_NULL)
  16. {
  17. rt_kprintf("No memory\n");
  18. return ;
  19. }
  20. if((sockfd = socket(PF_INET6, SOCK_DGRAM, 0)) == -1)
  21. {
  22. rt_kprintf("Socket error\n");
  23. rt_free(recv_data);
  24. return ;
  25. }
  26. memset(&server_addr6, 0, sizeof(server_addr6));
  27. server_addr6.sin6_family = AF_INET6;
  28. server_addr6.sin6_port = htons(SERV_PORT);
  29. if(inet_pton(AF_INET6, SERVADDR, &server_addr6.sin6_addr.s6_addr) != 1)
  30. {
  31. rt_kprintf("inet_pton() error\n");
  32. rt_free(recv_data);
  33. return ;
  34. }
  35. if(sendto(sockfd, send_data, sizeof(recv_data), 0, (struct sockaddr *)&server_addr6, sizeof(server_addr6)) < 0)
  36. {
  37. rt_kprintf("Sendto error\n");
  38. rt_free(recv_data);
  39. return ;
  40. }
  41. rt_kprintf("Waiting for a reply...\n");
  42. clientlen = sizeof(client_addr6);
  43. if(recvfrom(sockfd, recv_data, BUF_SIZE, 0, (struct sockaddr *)&client_addr6, &clientlen) < 0)
  44. {
  45. rt_kprintf("Recvfrom error\n");
  46. rt_free(recv_data);
  47. return ;
  48. }
  49. rt_kprintf("got '%s'\n", recv_data);
  50. closesocket(sockfd);
  51. }
  52. #ifdef RT_USING_FINSH
  53. #include <finsh.h>
  54. FINSH_FUNCTION_EXPORT(udpclient6, start udp server via ipv6);
  55. #endif