Domanda

Sto facendo una semplice applicazione WOL. Finora posso creare con successo una presa di corrente, tuttavia quando si imposta l'indirizzo utilizzando CFSocketSetAddress posso utilizzare solo la rete ip del mio computer (WiFi ip = 192.168.0.5) o IP locale (127.0.0.1).

Per WOL Vorrei inviare i dati per l'indirizzo di broadcast (255.255.255.255). Se questo viene immesso Io torno con l'errore 'indirizzo non potrebbe essere fissato'.

I Am miss-comprendere l'uso di CFSocketSetAddress, e l'indirizzo è supposto per essere i padroni di casa IP o l'IP di destinazione? In entrambi i casi, che cosa devo fare, in modo che la mia destinazione IP è l'indirizzo di broadcast?

Di seguito alcuni dei miei codice:

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


        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!");
       } 
È stato utile?

Soluzione

Ho risolto il problema utilizzando un metodo diverso (presa nativo GOT), e quindi invece di usare CFSocketSetAddress, passai l'indirizzo nel secondo argomento della CFSocketSendData.

Non ho un link / di riferimento per le modifiche, come è stato un po 'di codice memorizzato sul mio HDD da giorni di googling pesante.

vorremmo dire grazie a David Gelhar Chi mi ha segnalato nella giusta direzione dal mio precedente domanda .

per chiunque altro che potrebbe aver bisogno di questo questo è il mio codice;

//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");
    }

Altri suggerimenti

Per la mia app, il problema è che è stato sandbox, ma non è stato dato autorizzazioni di rete.

Se stai usando App Sandbox, è necessario controllare uno di questi:

La sezione App Sandbox di impostazioni di un progetto, con connessioni in ingresso '(Server)' controllata

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top