C ++套接字发送到Java服务器在几个小时后被挂起

时间:2017-07-11 10:52:56

标签: java c++ sockets tcpsocket

我的C ++程序是客户端与Java服务器连接。从连接建立起,C ++客户端以固定频率(比如10秒)发送大小约为1MB到3MB的数据块。

我的Java服务器打开一个套接字

Socket client = new ServerSocket(14001, 10).accept();//blocking
ReceiveThread st = new ReceiveThread(client);

并从客户端接收数据,如下所示。

private String getDataFromSocket(BufferedReader reader) throws IOException
    {
        int byteLimit = 1024*1024*2; //2 MB
        String output = "";
        char[] charArray = null;

        int availableSize = is.available();
        if(availableSize < 1)          // If available size is 0 just return empty
        {
            return output;
        }
        while(availableSize > byteLimit)   // Reads 2MB max if available size is more than 2 MB
        {
            charArray = new char[byteLimit];
            reader.read(charArray,0,charArray.length);
            output += new String(charArray);
            availableSize = is.available();
        }
        charArray = new char[availableSize];
        reader.read(charArray,0,charArray.length);
        output = output +new String(charArray);
        return output;
    }

上面的GetDataFromSocket继续检查可用数据,直到套接字正常关闭。

C ++与Java服务器连接

void CreateSocket()
{
    int  err, nRet = 0;
    sockfd = 0;
    WORD wVersionRequested;
    WSADATA wsaData;


    //WSACleanup();// Is this needed?
    wVersionRequested = MAKEWORD(1, 1);

    while (1)
    {
        err = WSAStartup(wVersionRequested, &wsaData);

        if (err != 0)
        {
            Sleep(50);
            continue;
        }
        else
        {
            break;
        }
    }
    while (1)
    {
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd == -1 || sockfd == INVALID_SOCKET)
        {
            Sleep(50);
            continue;
        }
        else
        {
            nRet = 1;
            break;
        }
    }
}

void ConnectWithServer()
{
    int nRet = 0;   
    char myname[256] = { 0 };
    int wsaErr = 0, portNum = 0, retryCount=0;
    struct hostent *h = NULL;
    struct sockaddr_in server_addr;

    gethostname(myname, 256);

    portNum = 1401;

    while (1)
    {
        if ((h = gethostbyname(myname)) != NULL)
        {
            memset(&server_addr, 0, sizeof(struct sockaddr_in));

            memcpy((char *)&server_addr.sin_addr, h->h_addr, h->h_length);

            server_addr.sin_family = AF_INET;
            server_addr.sin_port = htons(portNum);
            server_addr.sin_addr = *((struct in_addr*) h->h_addr);
        }

        if (0 == connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)))
        {
            nRet = 1;
            break;
        }
        else
        {
        }
        Sleep(50);
    }
}

通过上述两个函数建立到服务器的连接,并返回成功。在这些步骤之后,我每隔10秒就将数据缓冲区发送到Java服务器一次。

while(index<retryCount)
    {
        string toSend = wstring_to_utf8(sRequestData);
        nRet = send(sockfd, toSend.c_str(), toSend.length(), 0);
        if (nRet == SOCKET_ERROR)
        {
            wsaErr = WSAGetLastError();
            Sleep(DEFAULT);
            index++;
        }
        else if(nRet == toSend.length())
        {
            break;
        }
        else
        {
            index = 0;
        }
    }

这里的问题是,在从C ++向Java服务器发送和接收几个小时后,发送被挂起无限时间。执行永远不会来自send()函数。但是在挂起之后,如果我突然关闭Java服务器,那么send返回套接字错误并再次运行好几个小时并且挂起仍然发生。

正如我所提到的,我一直向服务器发送数据,大小从1 MB到3 MB不等。这可能是什么问题?我该如何解决这个问题?

0 个答案:

没有答案