Pregunta

Estoy haciendo una aplicación WOL simple. Hasta ahora puedo crear con éxito un socket, sin embargo, al configurar la dirección con CFSocketSetAddress, solo puedo usar la IP de red de mi computadora (Wifi IP = 192.168.0.5) o IP local (127.0.0.1).

Para WOL me gustaría enviar los datos a la dirección de transmisión (255.255.255.255). Si se ingresa esto, me devuelven el error 'La dirección no se pudo configurar'.

¿Estoy malinterpretando el uso de cfsocketsetaddress, y se supone que la dirección es la IP hosts o la IP de destino? En cualquier caso, ¿qué necesito hacer, para que mi IP de destino sea la dirección de transmisión?

A continuación se muestra algunos de mi código:

        /*************************************************************************/


        struct sockaddr_in addr;
        memset(&addr, 0, sizeof(addr));
        addr.sin_len = sizeof(addr);
        addr.sin_family = AF_INET;
        addr.sin_port = htons(PORT); //port
        inet_aton(IP, &addr.sin_addr);//IP is the host network ip: 192.168.0.5 


        NSData *address = [NSData dataWithBytes: &addr length: sizeof(addr)];

        if (CFSocketSetAddress(WOLsocket, (CFDataRef)address) != kCFSocketSuccess){
            NSLog(@"Address could not be set!");
       } 
¿Fue útil?

Solución

Resolví mi problema utilizando un método diferente (recibí un socket nativo), y luego, en lugar de usar cfsocketSetDress, pasé la dirección en el segundo argumento de cfsocketsendData.

No tengo un enlace/referencia para los cambios, ya que fue un código almacenado en mi HDD de Days of Heavy Googling.

Me gustaría agradecer a David Gelhar, quien me señaló en la dirección correcta de mi anterior pregunta.

Para cualquier otra persona que pueda necesitar esto, este es mi código;

//Gets native & sets options
        /*************************************************************************/
        int desc = -1;
        desc = CFSocketGetNative(WOLsocket);
        int yes = 1;

        if (setsockopt (desc, SOL_SOCKET, SO_BROADCAST, (char *)&yes, sizeof (yes)) < 0) {
            NSLog(@"Set Socket options failed");
            return EXIT_FAILURE;
        }
        //sets address socket - doesn't bind this is done in CFSocketSendData
        /*************************************************************************/
        unsigned long bcast = 0xffffffff;

        struct sockaddr_in addr;
        memset(&addr, 0, sizeof(addr));
        addr.sin_len = sizeof(addr);
        addr.sin_family = AF_INET;
        addr.sin_port = htons(PORT); //port
        addr.sin_addr.s_addr = bcast;
        NSData *address = [NSData dataWithBytes: &addr length: sizeof(addr)];

        //Sends Data
        /*************************************************************************/
        char ethadd []= "helloworld";
        CFDataRef Data = CFDataCreate(NULL, (const UInt8*)ethadd, sizeof(ethadd));
        if (CFSocketSendData(WOLsocket, address, Data, 0) < 0){
            NSLog(@"Data could not be sent!");
            return EXIT_FAILURE;
        }
        else NSLog(@"Data Sent");
    }

Otros consejos

Para mi aplicación, el problema es que estaba sandboxed, pero no se les dio permisos de red.

Si está utilizando App Sandbox, debe verificar uno de estos:

The App Sandbox section of a project's settings, with 'Incoming Connections (Server)' checked

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top