为什么数据不来自套接字?

时间:2019-05-06 16:26:53

标签: c++ sockets

服务器以1秒-2分钟的间隔不断向客户端发送数据。数据到达,但是大约15-20分钟后,客户端停止接收消息。在这种情况下,rv等于1和n! = 0,服务器发送数据(选中)。

while(1){
    FD_ZERO(&set);
    FD_SET(sockfd, &set);

    timeout.tv_sec = 30;
    timeout.tv_usec = 0;

    rv = select(sockfd + 1, &set, NULL, NULL, &timeout);
    std::cout << "rv Read: " << rv << std::endl;
    if(rv == -1){
        printf("ERROE select\n");
        restartSocket();
    }
    else if(rv == 0){
        printf("READ timeout\n");
    }
    else{
        bzero(buffer,256);
        printf("Start read\n");

        int n;
        n = read(sockfd,buffer,256);
        if (n < 0){
            printf("ERROR reading from socket");
            restartSocket();
        }
        printf("read: %s\n",buffer);
    }
}

再过10-15分钟,read()返回-1,然后服务器重新连接,并且在相同的15-20分钟内一切正常开始工作,然后一切转了一圈。

如何使客户端始终从服务器接收数据? 还是如何使read()或select()完全理解与服务器之间没有连接,并发出命令来重置套接字? (但是我认为每5-10分钟进行一次重新连接是不对的)

1 个答案:

答案 0 :(得分:1)

您没有考虑当对等方正常关闭连接时read()返回0的可能性。除此之外,关于连接管理的其他所有内容都看起来不错(但是,如果确切地 256个字节被读取,buffer不会以null终止,但这不是该问题的重点):< / p>

//bzero(buffer, 256); //not needed
printf("Start read\n");

int n = read(sockfd, buffer, 256);
if (n <= 0){
    if (n < 0)
        printf("ERROR reading from socket\n");
    else
        printf("socket disconnected\n");
    restartSocket();
} else {
    printf("read: %.*s\n", n, buffer);
}

此外,当您调用restartSocket()时,您可能应该退出while循环并在重新建立新连接之前不要重新进入循环(除非restartSocket()正在内部处理并更新) sockfd在下一个循环迭代之前。