udpserver6.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include <rtthread.h>
  2. #include <lwip/sockets.h>
  3. #define SERV_PORT 10012
  4. #define BUF_SIZE 1024
  5. static const char send_data[] = "This is UDP Server from RT-Thread.";
  6. void udpserver6(void)
  7. {
  8. int sockfd;
  9. struct sockaddr_in6 server_addr6;
  10. struct sockaddr_in6 client_addr6;
  11. int bytes_read;
  12. char *recv_data;
  13. rt_uint32_t addr_len;
  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(AF_INET6, SOCK_DGRAM, 0)) == -1)
  21. {
  22. rt_kprintf("Socket error\n");
  23. rt_free(recv_data);
  24. return ;
  25. }
  26. server_addr6.sin6_family = AF_INET6;
  27. server_addr6.sin6_port = htons(SERV_PORT);
  28. memcpy(server_addr6.sin6_addr.s6_addr, IP6_ADDR_ANY, 16);
  29. if(bind(sockfd, (struct sockaddr *)&server_addr6, sizeof(struct sockaddr)) == -1)
  30. {
  31. rt_kprintf("Bind error\n");
  32. rt_free(recv_data);
  33. return ;
  34. }
  35. rt_sprintf(recv_data, "%4d", SERV_PORT);
  36. rt_kprintf("UDPServer Waiting for client on port %s...\n", recv_data);
  37. addr_len = sizeof(struct sockaddr);
  38. while(1)
  39. {
  40. bytes_read = recvfrom(sockfd, recv_data, BUF_SIZE - 1, 0, (struct sockaddr *)&client_addr6, &addr_len);
  41. recv_data[bytes_read] = '\0';
  42. rt_kprintf("\n(%s, %d) said:", inet6_ntoa(client_addr6.sin6_addr), ntohs(client_addr6.sin6_port));
  43. rt_kprintf("%s", recv_data);
  44. if(strcmp(recv_data, "exit") == 0)
  45. {
  46. closesocket(sockfd);
  47. rt_free(recv_data);
  48. break;
  49. }
  50. }
  51. return ;
  52. }
  53. #ifdef RT_USING_FINSH
  54. #include <finsh.h>
  55. FINSH_FUNCTION_EXPORT(udpserver6, startup udp server via ipv6);
  56. #endif