1

これが Android の処理方法にあるのか、ネイティブ コードに問題があるのか​​、あるいはその両方なのかはわかりません。

C++ で udp ソケットをセットアップしています (swig によって生成されたラッパー):

udpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (udpSocket < 0)
        {
            pthread_mutex_unlock(&csOpenCloseUdp);
            throw IOException("Failed to open socket");
        }


        char bAllowMultiple = true;
        setsockopt(udpSocket, SOL_SOCKET, SO_REUSEADDR, &bAllowMultiple, sizeof(bAllowMultiple));
        setsockopt(udpSocket, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&hopLimit, sizeof(hopLimit));
        setsockopt(udpSocket, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localAddr, sizeof(localAddr));

        // Set to non-blocking mode
        unsigned long bMode = 1;
        ioctl( udpSocket, FIONBIO, &bMode );

        // Create the local endpoint
        sockaddr_in localEndPoint;
        localEndPoint.sin_family = AF_INET;
        localEndPoint.sin_addr.s_addr = localAddr.s_addr;
        localEndPoint.sin_port = groupEndPoint.sin_port;

        // Bind the socket to the port
        int r = bind(udpSocket, (sockaddr*)&localEndPoint, sizeof(localEndPoint));
        if (r == SOCKET_ERROR)
        {
            //LeaveCriticalSection(&csOpenCloseUdp);
            pthread_mutex_unlock(&csOpenCloseUdp);
            close();
            throw IOException("Failed to bind port");
        }


        // Join the multicast group
        struct ip_mreq imr;
        imr.imr_multiaddr = groupEndPoint.sin_addr;
        imr.imr_interface.s_addr = localAddr.s_addr;
        setsockopt(udpSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&imr, sizeof(imr));

ソケットは例外をスローしていません。この後、INVALID_SOCKET ではない値がいくつかあります。

パケットを送ろうとすると、

int r = sendto(udpSocket, (char*)dataToSend, (size_t)length, 0, (sockaddr*)&groupEndPoint, (socklen_t)sizeof(groupEndPoint));

エラー番号 101: ネットワークに到達できません。

私はソケット プログラミングにまったく慣れていません。Android のソケットを開始するのが悪い方法であることは知っていますが、実際には、これを完了する必要があり、時間がほとんどありません。ネットワークに到達できない可能性がある理由を知っている人はいますか? AndroidでUDPを試してみた人はいますか?

4

2 に答える 2

1

C++ ソケットを使用する必要はありますか? 可能であれば、時間の都合上、そしてほぼすべての利益のために、代わりに Java API をお勧めします。使用方法の例を次に示します: http://android-er.blogspot.com/2011/01/simple-communication-using.html。私は C が好きですが、ここでは使用しないことをお勧めします。

于 2012-05-02T07:26:00.560 に答える