ars548recv.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "ars548recv.h"
  2. ars548recv::ars548recv()
  3. {
  4. InitSock();
  5. std::thread * pthread = new std::thread(&ars548recv::threadrecv,this);
  6. }
  7. void ars548recv::InitSock()
  8. {
  9. std::string mcast_ip("224.0.2.2");
  10. uint16_t mcast_port = 42102;
  11. notify_fd_ = socket(AF_INET, SOCK_DGRAM, 0);
  12. if (notify_fd_ == -1) {
  13. std::cout << "fail to create notify fd, " << strerror(errno);
  14. return ;
  15. }
  16. memset(&notify_addr_, 0, sizeof(notify_addr_));
  17. notify_addr_.sin_family = AF_INET;
  18. notify_addr_.sin_addr.s_addr = inet_addr(mcast_ip.c_str());
  19. notify_addr_.sin_port = htons(mcast_port);
  20. listen_fd_ = socket(AF_INET, SOCK_DGRAM, 0);
  21. if (listen_fd_ == -1) {
  22. std::cout << "fail to create listen fd, " << strerror(errno);
  23. return ;
  24. }
  25. if (fcntl(listen_fd_, F_SETFL, O_NONBLOCK) == -1) {
  26. std::cout << "fail to set listen fd nonblock, " << strerror(errno);
  27. return ;
  28. }
  29. memset(&listen_addr_, 0, sizeof(listen_addr_));
  30. listen_addr_.sin_family = AF_INET;
  31. listen_addr_.sin_addr.s_addr = htonl(INADDR_ANY);
  32. listen_addr_.sin_port = htons(mcast_port);
  33. int yes = 1;
  34. if (setsockopt(listen_fd_, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0) {
  35. std::cout << "fail to setsockopt SO_REUSEADDR, " << strerror(errno);
  36. return ;
  37. }
  38. if (bind(listen_fd_, (struct sockaddr*)&listen_addr_, sizeof(listen_addr_)) <
  39. 0) {
  40. std::cout << "fail to bind addr, " << strerror(errno);
  41. return ;
  42. }
  43. int loop = 1;
  44. if (setsockopt(listen_fd_, IPPROTO_IP, IP_MULTICAST_ALL, &loop,
  45. sizeof(loop)) < 0) {
  46. std::cout << "fail to setsockopt IP_MULTICAST_LOOP, " << strerror(errno);
  47. return ;
  48. }
  49. struct ip_mreq mreq;
  50. // mreq.imr_interface.s_addr = htonl(INADDR_ANY);
  51. inet_aton( "192.168.1.102", &(mreq.imr_interface) );
  52. if (setsockopt(listen_fd_, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,
  53. sizeof(mreq)) < 0) {
  54. std::cout << "fail to setsockopt IP_ADD_MEMBERSHIP, " << strerror(errno);
  55. return ;
  56. }
  57. return ;
  58. }
  59. void ars548recv::threadrecv()
  60. {
  61. int timeout_ms = 100;
  62. while(1)
  63. {
  64. int nrtn = 0;
  65. struct pollfd fds;
  66. fds.fd = listen_fd_;
  67. fds.events = POLLIN;
  68. int ready_num = poll(&fds, 1, timeout_ms);
  69. if (ready_num > 0) {
  70. char buf[32] = {0}; // larger than ReadableInfo::kSize
  71. ssize_t nbytes = recvfrom(listen_fd_, buf, 32, 0, nullptr, nullptr);
  72. if (nbytes == -1) {
  73. std::cout << "fail to recvfrom, " << strerror(errno)<<std::endl;
  74. continue;
  75. }
  76. if(nbytes >0)
  77. {
  78. std::cout<<" recv data: "<<nbytes<<std::endl;
  79. }
  80. // return info->DeserializeFrom(buf, nbytes);
  81. } else if (ready_num == 0) {
  82. continue;
  83. } else {
  84. continue;
  85. if (errno == EINTR) {
  86. std::cout << "poll was interrupted."<<std::endl;
  87. } else {
  88. std::cout << "fail to poll, " << strerror(errno);
  89. }
  90. }
  91. }
  92. }