tcpclient6.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include <rtthread.h>
  2. #include <lwip/netdb.h>
  3. #include <lwip/sockets.h>
  4. #define SERV_PORT 12345
  5. #define SERVADDR "4006:e024:680:c6e:223:8bff:fe59:de90" // Do not use link-local address, lwip-head did not implement it.
  6. #define BUF_SIZE 1024
  7. static const char send_data[] = "This is TCP Client from RT-Thread.";
  8. void tcpclient6(void)
  9. {
  10. char* recv_data;
  11. int sockfd, bytes_received;
  12. struct sockaddr_in6 server_addr6;
  13. int status = 0;
  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_STREAM, 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. status = connect(sockfd, (struct sockaddr *)&server_addr6, sizeof(server_addr6));
  36. if(status < 0)
  37. {
  38. rt_kprintf("Connect error:%d\n", status);
  39. rt_free(recv_data);
  40. return ;
  41. }
  42. while(1)
  43. {
  44. bytes_received = recv(sockfd, recv_data, BUF_SIZE -1, 0);
  45. if(bytes_received <= 0)
  46. {
  47. closesocket(sockfd);
  48. rt_free(recv_data);
  49. break;
  50. }
  51. recv_data[bytes_received] = '\0';
  52. if(strcmp(recv_data, "q") == 0 || strcmp(recv_data, "Q") == 0)
  53. {
  54. closesocket(sockfd);
  55. rt_free(recv_data);
  56. break;
  57. }
  58. else
  59. {
  60. rt_kprintf("\nReceived data = %s ", recv_data);
  61. }
  62. send(sockfd, send_data, strlen(send_data), 0);
  63. }
  64. return;
  65. }
  66. #ifdef RT_USING_FINSH
  67. #include <finsh.h>
  68. FINSH_FUNCTION_EXPORT(tcpclient6, startup tcp client via ipv6);
  69. #endif