我不知道这是否是我处理Android的方式,还是我的 native 代码有问题,或两者兼而有之。

我正在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));

我得到errno 101:网络无法访问。

我是套接字编程的新手,我知道Android中的套接字是一个不好的开始方式,但是事实是我必须完成这项工作,而且时间很少。这里有人知道网络不可达的可能原因吗?有没有人尝试过在Android上使用UDP并可以说明一些问题?

最佳答案

是否有使用C++套接字的要求?如果可能的话,为了节省时间,并且非常
为了所有人的利益,我建议使用Java API。这是一个如何使用它的示例:http://android-er.blogspot.com/2011/01/simple-communication-using.html。我喜欢C,但建议不要在这里使用它。

关于android - android ndk sockets网络不可达,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10408980/

10-12 12:52
查看更多