服务器后台TCP连接存活问题(2)

if ( nReadyNums < 0 )
        {
            printf("epoll_wait error\n");
            exit(-1);
        }

for ( i = 0; i <  nReadyNums; ++i)
        {
            if ( events[i].data.fd == nServerFd )
            {
                nClientFd = accept( nServerFd, NULL, NULL );

AddFd( epfd, nClientFd, 1 );

}else if ( events[i].events & EPOLLIN )
            {
                // Can be implemented by threadpool
                //Read data from client
                pthread_create( &tid, NULL, ReadFromClient, (void *)(events[i].data.fd) );

}else if ( events[i].events & EPOLLRDHUP )
            {
                //Close By Peer
                printf("Close By Peer\n");
                close( events[i].data.fd );
            }else
            {
                printf("Some thing happened\n");
            }

}
    }

return 0;
}

测试内容:

注:客户端IP: 192.168.10.108  服务器IP&Port: 192.168.10.110:7777

a. 客户端发送一个报文至服务端,然后断网。(这里对程序做了点改动,这次实验注释了write响应,防止write影响测试,后面一个实验会使用write)。

   客户端断网后,使用netstat查看网络连接状态发送客户端与服务端还处于established状态,如图所示。

服务器后台TCP连接存活问题

a. 实验结果

  服务端没有检测到客户端断网,依然处于连接状态。

b. 客户端发送一个报文至服务端,然后断网,关闭客户端,再重复一次。

  这次试验测试重新联网,程序再次建立Socket连接是否会导致之前的连接被检测到。

服务器后台TCP连接存活问题

b. 实验结论:

  重新联网,程序再次建立Socket连接之前的连接不会被检测到。

c. 客户端发送一个报文至服务端,然后断网。(这次实验使用了write响应,查看write后的结果)。

  这里查看到Write居然成功了,成功了....。

服务器后台TCP连接存活问题

c. 实验结论:

  这次使用write不会检测对端是否已经断了。

3. 解决方案

  临时:使用TCP的选项SO_KEEPALIVE检测客户端是否已异常掉了(setsockopt)。

  后续改进:使用心跳包来检测长连接存活问题。

注:SO_KEEPALIVE明天再补充,回家了,只有一台笔记本直接装了Ubuntu,没装虚拟机,伤不起。

4. 补充

  如果什么不对的或者建议直接说,多讨论讨论比较好。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5ec016c3a8b2a7d4563d417a495a6b37.html