CfsocketsetAddress сбой, если не хост компьютерного IP?
-
25-10-2019 - |
Вопрос
Я делаю простое приложение WOL. До сих пор я могу успешно создать сокет, однако при настройке адреса с использованием cfsocketsetaddress я могу использовать только IP -адрес сети моего компьютера (WiFi IP = 192.168.0.5) или локальный IP (127.0.0.1).
Для WOL я хотел бы отправить данные по адресу вещания (255.255.255.255). Если это введено, я возвращается с ошибкой «адрес« не может быть установлен ».
Неужели я не понимаю использование CFSocketSetAddress, и адрес должен быть IP-хостом или IP-адресом назначения? В любом случае, что мне нужно сделать, чтобы мой IP -адрес назначения был адресом трансляции?
Ниже приведены некоторые из моего кода:
/*************************************************************************/
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!");
}
Решение
Я решил свою проблему, используя другой метод (получил натуральный розетка), а затем вместо использования cfsocketsetadress я принял адрес во втором аргументе CFSocketSendata.
У меня нет ссылки/ссылки для изменений, так как это был какой -то код, хранящийся на моем жестком жестком диске с дней тяжелого гугля.
Хотел бы поблагодарить Дэвида Гелхара, который указал мне в правильном направлении от моего предыдущего вопрос.
Для тех, кому это может понадобиться, это мой код;
//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");
}
Другие советы
Для моего приложения проблема в том, что это была песочница, но ему не было предоставлено сетевые разрешения.
Если вы используете Sandbox App, вам нужно проверить один из них: