4

簡単な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!");
       } 
4

2 に答える 2

3

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

激しいグーグルの日々からHDDに保存されたコードであったため、変更のリンク/リファレンスがありません。

前の質問から正しい方向に私を向けてくれたDavidGelharに感謝します。

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

//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");
    }
于 2011-07-25T11:31:50.473 に答える
2

私のアプリの場合、問題はサンドボックス化されているが、ネットワーク権限が付与されていないことです。

App Sandboxを使用している場合は、次のいずれかを確認する必要があります。

プロジェクトの設定の[アプリサンドボックス]セクションで、[着信接続(サーバー)]がオンになっている

于 2017-11-20T23:15:24.863 に答える