【问题标题】:android ndk sockets Network Unreachableandroid ndk 套接字网络无法访问
【发布时间】:2012-05-11 15:30:06
【问题描述】:

我不知道这是我处理 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));

套接字没有抛出任何异常,在此之后它的 some 值不是 INVALID_SOCKET。

当我尝试发送数据包时,

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

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

我对套接字编程很陌生,而且我知道 Android 中的套接字是一种不好的开始方式,但事实是我必须完成这项工作并且时间很少。这里有人知道导致网络无法访问的可能原因吗?有没有人尝试过在 Android 上使用 UDP 并能有所启发?

【问题讨论】:

  • 造成这种情况的原因可能不在代码中,而在网络设置中。如果您在自己的私人 Wi-Fi 网络中,则应检查路由器设置。
  • 我在 arm 开发板设备上使用物理 LAN。我将有一个直接从设备到它正在与之交谈的设备的专用链接。如果有人以前尝试过这种事情,我们将不胜感激
  • 你能从 adb 命令行 ping 其他系统吗?
  • 嗯。似乎没有。 Ping 到我的笔记本电脑的 IP 会返回无法从 adb shell 访问的网络。想法?
  • ip -s addr 显示 eth0: BROADCAST, MULTICAST mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 08:90:00:a0:02:10 brd ff:ff:ff:ff:ff :ff

标签: android c++ sockets udp sendto


【解决方案1】:

是否需要使用 C++ 套接字?如果可能的话,为了时间,而且几乎 为了一切的利益,我会推荐Java API。以下是如何使用它的示例:http://android-er.blogspot.com/2011/01/simple-communication-using.html。我喜欢 C,但我建议不要在这里使用它。

【讨论】:

  • 欣赏建议,但 C++ 就在那里,我得到了一个设备驱动程序库并被告知要转换它。我没有时间或知道如何用 java 重写库,我所拥有的是现在与 ANSI 兼容的 c++,我的问题似乎是 android 如何访问 linux 基础网络驱动程序,但我不确定。
  • 如果有帮助,可能不是 Android 访问 linux 基础网络驱动程序的方式。我发现 Android 与其他 Linux 发行版非常一致。您的代码或它的命令行版本是否可以在另一个发行版上运行?
【解决方案2】:

已解决:

我只需要修改设备上的以太网设置,就可以让它与我的笔记本电脑通信。出于某种原因,它不喜欢使用专用链接,所以我正在通过本地网络路由器并且它正在工作。现在遇到了不同的问题,但是这个已经完成了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2018-12-16
    • 2018-10-03
    相关资源
    最近更新 更多