- linux joining multicast group setsockopt returns errno 19 device not found
- int hopLimit = 1;
- int bAllowMultiple = 1;
- in_addr localAddr;
- localAddr.s_addr = 0;
- in_addr groupAddress;
- groupAddress.s_addr = inet_addr(ADDRESS);
- sockaddr_in groupEndPoint;
- groupEndPoint.sin_family = AF_INET;
- groupEndPoint.sin_addr = groupAddress;
- groupEndPoint.sin_port = htons(PORT);
- SOCKET udpsocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if(udpsocket == -1){
- printf("Socket failn%dn", errno);
- return 1;
- }
- if(setsockopt(udpsocket, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&hopLimit, sizeof(hopLimit))==-1){
- printf("sockopt failed: IP_MULTICAST_TTLn%dn", errno);
- return 1;
- }
- if(setsockopt(udpsocket, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localAddr, sizeof(localAddr))==-1){
- printf("sockopt failed: IP_MULTICAST_IFn%dn", errno);
- return 1;
- }
- if(setsockopt(udpsocket, SOL_SOCKET, SO_REUSEADDR, &bAllowMultiple, sizeof(bAllowMultiple))==-1){
- printf("sockopt failed: SO_REUSEADDRn%dn", errno);
- return errno;
- }
- // Set to non-blocking mode
- unsigned long bMode = 1;
- if(ioctl( udpsocket, FIONBIO, &bMode )==-1){
- printf("ioctl failedn%dn", errno);
- return errno;
- }
- sockaddr_in localEndPoint;
- localEndPoint.sin_family = AF_INET;
- localEndPoint.sin_addr.s_addr = localAddr.s_addr;
- localEndPoint.sin_port = groupEndPoint.sin_port;
- // Bind the socket to the port
- int r = bind(udpsocket, (sockaddr*)&localEndPoint, sizeof(localEndPoint));
- if (r != 0)
- {
- printf("Bind failedn%dn", errno);
- return errno;
- }
- // Join the multicast group
- struct ip_mreq imr;
- imr.imr_multiaddr = groupEndPoint.sin_addr;
- imr.imr_interface.s_addr = groupEndPoint.sin_addr.s_addr;
- r = setsockopt(udpsocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr, sizeof(imr));
- printf("%dn",r);
- if (r == -1){
- printf("sockopt failed: IP_ADD_MEMBERSHIPn%dn", errno);
- return errno;
- }