Android NDK非确定性Socket connect()超时

时间:2017-08-02 10:40:57

标签: android c sockets android-ndk

我遇到了客户端/服务器应用程序的问题,这是一个更大的分布式计算系统的一部分。客户端是运行用C编写的本机Android NDK应用程序的Android设备。在某些时候,客户端将注册消息发送到服务器应用程序,该应用程序也用C编写并在Windows机器上运行。

奇怪的是,在设备上安装Android应用程序后,一切正常。但是,一段时间后Socket问题就开始了。所有connect()函数调用都以客户端的超时结束。该错误不是确定性的,并且发生在不同的时间点。为了使其再次工作,我必须手动卸载Android中的应用程序并重新安装它。之后,我工作了一段时间,然后错误再次开始。在普通Windows PC上运行的客户端上使用相同的C代码,并且不会出现问题。

网络连接很好,如果服务器端口是打开的,并且可以通过客户端设备使用Simple Socket Tester应用程序访问,我检查了网络连接。我还给了Android使用Internet的权限,connect()调用的参数是正确的。

编辑:

很抱歉找不到代码。我认为错误是显而易见的,并且基于不同的平台,因为它适用于Windows并且我在Android NDK中没有经验。这是代码:

int pi_connect(SOCKET s, const SOCKADDR *name, int namelen) 
{

    int result = connect(s, name, namelen);

    if (result < 0) {
        ALOG("Socket connecting error!");

        return -1;
    }

    return result;
}

SOCKET pi_socket(int af, int type, int protocol) {

    SOCKET returnSocket = socket(af, type, protocol);
    int yes = 1;
    if (setsockopt(returnSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
    {
        perror("Server-setsockopt() error!");
        exit(1);
    }

    if (returnSocket < 0) {
        ALOG("Socket creation error!");

        return -1;
    }

    return returnSocket;
}

SOCKET setupSendSocket(u_long host, int hostPort) {
    SOCKET sendingSocket;
    SOCKADDR_IN addr;

    sendingSocket = pi_socket(AF_INET, SOCK_STREAM, 0);

    memset(&addr, 0, sizeof(SOCKADDR_IN));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(hostPort);
    addr.sin_addr.s_addr = host;

    long rc = pi_connect(sendingSocket, (SOCKADDR*) &addr, sizeof(SOCKADDR));
    if (rc < 0) {
        return 0;
    } 
    return sendingSocket;
}

void requestOwnIP() {

    SOCKET connectedIPSocket = setupSendSocket(inet_addr(brokerIP), 34123);

    if(connectedIPSocket==0)
        return;

    sendBHeartbeatMessage(connectedIPSocket);

    myIP = receiveBIPMessage(connectedIPSocket);

    pi_closesocket(connectedIPSocket);
}

在NDK应用程序的main函数中调用requestOwnIP()函数。

EDIT 2(一些新评论):重启设备后,connect()再次成功,系统工作一段时间。操作系统的进程表中是否存在可能导致此问题的内容?我首先虽然可能是大量的套接字处于time_wait状态,但我添加了SO_REUSEADDR并且问题仍然存在。

我真的很感激一些帮助。提前谢谢!

此致 多米尼克

0 个答案:

没有答案