Сбой CFSocketSetAddress, если не IP-адрес главного компьютера? - PullRequest
4 голосов
/ 25 июля 2011

Я делаю простое приложение 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!");
       } 

Ответы [ 2 ]

3 голосов
/ 25 июля 2011

Я решил свою проблему, используя другой метод (получил собственный сокет), и затем вместо использования CFSocketSetAddress я передал адрес во втором аргументе CFSocketSendData.

У меня нет ссылки / ссылки на изменения, так как это был какой-то код, который хранился на моем жестком диске со времен интенсивного поиска в Google.

Хотел бы сказать спасибо Дэвиду Гелхару, который указал мне правильное направление от моего предыдущего вопроса .

для всех, кому это может понадобиться, это мой код;

//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");
    }
2 голосов
/ 21 ноября 2017

Для моего приложения проблема в том, что оно было изолированно, но ему не были предоставлены сетевые разрешения.

Если вы используете изолированную программную среду приложения, вам нужно проверить один из них:

Раздел «Песочница приложения» в настройках проекта с установленным флажком «Входящие подключения (сервер)»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...