Question

Je fais une simple application de WOL. Jusqu'à présent, je peux créer avec succès une prise, mais lorsque vous réglez l'adresse à l'aide CFSocketSetAddress je ne peut utiliser le réseau IP de mon ordinateur (WiFi ip = 192.168.0.5) ou ip local (127.0.0.1).

Pour WOL Je voudrais envoyer les données à l'adresse de diffusion (255.255.255.255). Si cela est entré, je suis retourné avec l'erreur 'adresse ne pouvait pas être réglée.

Suis-je manque-compréhension de l'utilisation de CFSocketSetAddress, et l'adresse est censé être les hôtes IP ou l'adresse IP de destination? Dans les deux cas, que dois-je faire, pour que mon IP de destination est l'adresse de diffusion?

Voici une partie de mon code:

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


        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!");
       } 
Était-ce utile?

La solution

I résolu mon problème en utilisant une méthode différente (A obtenu de douille native), puis au lieu d'utiliser CFSocketSetAddress, je suis passé l'adresse dans le second argument de CFSocketSendData.

Je n'ai pas un lien / référence pour les changements, car il était un code stocké sur mon disque dur de jours de googler lourd.

voudrais dire merci à David Gelhar qui m'a orienté dans la bonne direction de mon précédent question .

pour toute autre personne qui pourrait avoir besoin de ce ceci est mon 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");
    }

Autres conseils

Pour mon application, le problème est qu'il a été mis en sandbox, mais il n'a pas été donné autorisations réseau.

Si vous utilisez App Sandbox, vous devez vérifier un de ces:

La section App Sandbox des paramètres d'un projet, avec les 'connexions entrantes (serveur)' cochée «  loading=

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top