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;
}

Reply via email to