Frage

Ich mache eine einfache WOL -Anwendung. Bisher kann ich jedoch erfolgreich eine Socket erstellen. Wenn ich jedoch die Adresse mithilfe von CFSOCKETSETADDRESS einstellen kann, kann ich nur die Netzwerk -IP meines Computers (WiFi IP = 192.168.0.5) oder lokaler IP (127.0.0.1) verwenden.

Für WOL möchte ich die Daten an die Broadcast -Adresse senden (255.255.255.255). Wenn dies eingegeben wird, werde ich mit dem Fehler zurückgegeben, der nicht festgelegt werden kann.

Verstehe ich die Verwendung von CFSOCKETSETADDRESS, und die Adresse soll die Hosts-IP oder die Ziel-IP sein? Was muss ich in beiden Fällen tun, damit meine Ziel -IP die Broadcast -Adresse ist?

Unten ist ein Teil meines Codes:

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


        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!");
       } 
War es hilfreich?

Lösung

Ich habe mein Problem unter Verwendung einer anderen Methode (native Socket) gelöst, und anstatt CFSocketSetaddress zu verwenden, habe ich die Adresse im zweiten Argument von CFSocketSendData übergeben.

Ich habe keinen Link/keine Referenz für die Änderungen, da es ein Code war, das auf meiner Festplatte aus Days of Heavy Googeln gespeichert war.

Ich möchte mich bei David Gelhar bedanken, der mich in die richtige Richtung von meinem vorherigen richtete Frage.

Für alle anderen, die dies brauchen, ist dies mein Code;

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

Andere Tipps

Für meine App ist das Problem, dass es Sandboxen hat, aber keine Netzwerkberechtigungen erhielten.

Wenn Sie App Sandbox verwenden, müssen Sie eines davon überprüfen:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top