服务器以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分钟进行一次重新连接是不对的)
答案 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
在下一个循环迭代之前。