CFSOCKETSETADDRESS fällt fehl, wenn nicht Host -Computer -IP?
-
25-10-2019 - |
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!");
}
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: