PROBLEM: setsockopt & IP_ADD_MEMBERSHIP

Hi,

I’ve got a problem with this piece of code :frowning: (reduced) under QNX 6.3:

[color=darkred]sd = socket (PF_INET, SOCK_DGRAM, 0);
if (sd >= 0) {
mreq.imr_interface.s_addr = INADDR_ANY;
if(setsockopt (sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof (mreq)) !=0) {
//here goes error errno=EINVAL :question:
}

}

I looked in internet for something about this problem, but it looks I’m not alone with this :confused: .
I’ve tried many possibe combinations op IP’s in structure mreq but everytime it fail on EINVAL!
Is there problem in network interface of setsockopt?
Can anybody help me? Thanx.

What group are you joining ?

You are not setting mreq.imr_multiaddr.s_addr in the snippet your provide.

my “test” source:

[color=darkred]//here are combinations I’ve tested and they don’t work

//mreq.imr_interface.s_addr = 0x0;
//mreq.imr_multiaddr.s_addr = 0x0;

//mreq.imr_interface.s_addr = inet_addr(“192.168.10.177”);
//mreq.imr_multiaddr.s_addr = inet_addr(“192.168.10.255”);

//mreq.imr_interface.s_addr = htonl(INADDR_ANY);
//mreq.imr_multiaddr.s_addr = inet_addr(“192.168.10.255”);

mreq.imr_interface.s_addr = inet_addr(“192.168.10.177”);
mreq.imr_multiaddr.s_addr = htonl(INADDR_ANY);

printf(“IFace %s\r\n”, inet_ntoa(mreq.imr_interface));
printf(“BCAST %s\r\n”, inet_ntoa(mreq.imr_multiaddr));

if (setsockopt(fd, IPPROTO_UDP, IP_ADD_MEMBERSHIP, (char *) &mreq, sizeof(mreq)) != 0) {
//broadcast receiving failed
errvalue = errno;
printf(errstr, “Warn: Err BROADCAST listening (%d: %s)”, errvalue, strerror( errvalue ));
}

ifconfig returns:

[color=darkblue]lo0: flags=8009<UP,LOOPBACK,MULTICAST> mtu 33212
capabilities=7<IP4CSUM,TCP4CSUM,UDP4CSUM>
enabled=0<>
inet 127.0.0.1 netmask 0xff000000
en0: flags=8a43<UP,BROADCAST,RUNNING,ALLMULTI,SIMPLEX,MULTICAST> mtu 1500
capabilities=7<IP4CSUM,TCP4CSUM,UDP4CSUM>
enabled=0<>
address: 00:04:75:e4:84:63
inet 192.168.10.177 netmask 0xffffff00 broadcast 192.168.10.255
en1: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
capabilities=7<IP4CSUM,TCP4CSUM,UDP4CSUM>
enabled=0<>
address: 00:04:75:e4:2e:b0

GOTTA IT

I must have IP from D class (for example 224.1.1.1), then it works…
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
mreq.imr_multiaddr.s_addr = inet_addr(“224.1.1.255”);