On Wednesday 05 August 2015 15:24:49 Light, John J wrote: > I suspect the problem is really that IOS is being obsessive about the length > arguments for bind and/or getsockname.
You're right on the money. The two attached programs differ only by the setting of the socklen_t len variable. good.c works and bad.c fails. Confirmed in the Darwin source code (OS X 10.9 sources, as FXR hasn't indexed Yosemite yet): in http://fxr.watson.org/fxr/source/bsd/netinet/in_pcb.c?v=xnu-2050.18.24#L448 from http://fxr.watson.org/fxr/source/bsd/netinet/udp_usrreq.c?v=xnu-2050.18.24#L1732 from http://fxr.watson.org/fxr/source/bsd/kern/uipc_socket.c?v=xnu-2050.18.24;im=excerpts#L697 from http://fxr.watson.org/fxr/source/bsd/kern/uipc_syscalls.c?v=xnu-2050.18.24;im=excerpts#L268 Also note in that function how you can bind to a multicast address... -- Thiago Macieira - thiago.macieira (AT) intel.com Software Architect - Intel Open Source Technology Center -------------- next part -------------- #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> int main() { union { struct sockaddr_storage ss; struct sockaddr_in6 s6; struct sockaddr_in s4; struct sockaddr sa; } addr; socklen_t len = sizeof(addr.s4); addr.s4.sin_family = AF_INET; addr.s4.sin_port = htons(1234); addr.s4.sin_addr.s_addr = INADDR_ANY; int fd = socket(addr.ss.ss_family, SOCK_DGRAM, 0); return bind(fd, &addr.sa, len) == -1; } -------------- next part -------------- #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> int main() { union { struct sockaddr_storage ss; struct sockaddr_in6 s6; struct sockaddr_in s4; struct sockaddr sa; } addr; socklen_t len = sizeof(addr); addr.s4.sin_family = AF_INET; addr.s4.sin_port = htons(1234); addr.s4.sin_addr.s_addr = INADDR_ANY; int fd = socket(addr.ss.ss_family, SOCK_DGRAM, 0); return bind(fd, &addr.sa, len) == -1; }
