Вопрос

Я делаю простое приложение 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, вам нужно проверить один из них:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top