hawxgamer

multicast receiver

Oct 13th, 2014
288
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.55 KB | None | 0 0
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <netinet/in.h>
  4. #include <arpa/inet.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <unistd.h>
  9.  
  10. #define MAX_LEN 1024
  11.  
  12. int main(int argc, char *argv[])
  13. {
  14. int sock;
  15. int flag_on = 1;
  16. struct sockaddr_in multicast_addr;
  17. char message_received[MAX_LEN+1];
  18. int msgrecv_len;
  19. struct ip_mreq mc_req;
  20. char* multicast_ip;
  21. unsigned short multicast_port;
  22. struct sockaddr_in from_addr;
  23. unsigned int from_len;
  24. /*
  25. if (argc != 3)
  26. {
  27. fprintf(stderr, "Usage: %s Multicast_IP Multicast_Port\n", argv[0]);
  28. exit(1);
  29. }
  30. */
  31. multicast_ip = "224.5.6.7";//argv[1]; /* arg 1: multicast ip address */
  32. multicast_port = 5006;//atoi(argv[2]); /* arg 2: multicast port number */
  33.  
  34. if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
  35. {
  36. perror("socket() failed");
  37. exit(1);
  38. }
  39.  
  40. /* set reuse port to on to allow multiple binds per host */
  41. if ((setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag_on,
  42. sizeof(flag_on))) < 0)
  43. {
  44. perror("setsockopt() failed");
  45. exit(1);
  46. }
  47.  
  48. /* construct a multicast address structure */
  49. memset(&multicast_addr, 0, sizeof(multicast_addr));
  50. multicast_addr.sin_family = AF_INET;
  51. multicast_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  52. multicast_addr.sin_port = htons(multicast_port);
  53.  
  54. /* bind to multicast address to socket */
  55. if ((bind(sock, (struct sockaddr *) &multicast_addr, sizeof(multicast_addr))) < 0)
  56. {
  57. perror("bind() failed");
  58. exit(1);
  59. }
  60.  
  61. /* construct an IGMP join request structure */
  62. mc_req.imr_multiaddr.s_addr = inet_addr(multicast_ip);
  63. mc_req.imr_interface.s_addr = htonl(INADDR_ANY);
  64.  
  65. /* send an ADD MEMBERSHIP message via setsockopt */
  66. if ((setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void*) &mc_req, sizeof(mc_req))) < 0)
  67. {
  68. perror("setsockopt() failed");
  69. exit(1);
  70. }
  71.  
  72. while(1)
  73. {
  74. memset(message_received, 0, sizeof(message_received));
  75. from_len = sizeof(from_addr);
  76. memset(&from_addr, 0, from_len);
  77.  
  78. /* block waiting to receive a packet */
  79. if ((msgrecv_len = recvfrom(sock, message_received, MAX_LEN, 0, (struct sockaddr*)&from_addr, &from_len)) < 0)
  80. {
  81. perror("recvfrom() failed");
  82. break;
  83. }
  84.  
  85. printf("Received %d bytes from %s: ", msgrecv_len,
  86. inet_ntoa(from_addr.sin_addr));
  87. printf("%s", message_received);
  88. }
  89.  
  90. /* send a DROP MEMBERSHIP message via setsockopt */
  91. if ((setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, (void*) &mc_req, sizeof(mc_req))) < 0)
  92. {
  93. perror("setsockopt() failed");
  94. exit(1);
  95. }
  96. close(sock);
  97. }
Advertisement
Add Comment
Please, Sign In to add comment