質問

簡単な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!");
       } 
役に立ちましたか?

解決

別の方法(ネイティブソケットを取得)を使用して問題を解決し、CFSocketSetAddressを使用する代わりに、CFSocketsendDataの2番目の引数でアドレスを渡しました。

ヘビーグーグルの日々からHDDに保存されているコードがあるため、変更のリンク/参照はありません。

私の前から私を正しい方向に向けてくれたデビッド・ゲルハールに感謝したいと思います 質問.

これを必要とするかもしれない他の誰にとっても、これは私のコードです。

//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");
    }

他のヒント

私のアプリでは、問題はサンドボックス化されたことですが、ネットワークの権限は与えられていませんでした。

アプリサンドボックスを使用している場合、これらのいずれかを確認する必要があります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top