1、方法一: 客户端正常关闭,client端close()联接,server会报某个sockfd可读,即epollin来临。 然后recv一下,如果返回0再掉用epoll_ctl中的EPOLL_CTL_DEL,同时close(sockfd)。有些系统会收到一个EPOLLRDHUP,当然检测这个是最好不过了。只可惜是有些系统,上面的方法最保险;如果能加上对EPOLLRDHUP的处理那就是万能的了
2、方法二:客户端异常关闭,并不会通知服务器(如果会通知,以前的socket当然会有与此相关 的api)。正常关闭时read到0后,异常断开时检测不到的。服务器再给一个已经关闭的socket写数据时,会出错,这时候,服务器才明白对方可能已经异常断开了
3、方法三:当使用 select()函数测试一个socket是否可读时,如果select()函数返回值为1,且使吹涡皋陕用recv()函数读取的数据长度为0 时,就说明该socket已经断开。为了更好的判定socket是否断开,我判断当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR 。如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。
4、方法四:如何实现用户掉线检测?SO_KEEPALIV苇质缵爨E ,SIO_KEEPALIVE_VALS 和Heart-Beat线程。(1)SO_KE呶蓟鹭毵EPALIVE 机制,这是socket库提供的功能,设置接口是setsockopt API:如果为socket设置了KEEPALIVE选项,TCP/IP栈在检测到对方掉线后,任何在该socket上进行的调用(发送/接受调用)就会立刻返回,错误号是WSAENETRESET ;缺点: 默认设置是空闲2小时才发送一个“保持存活探测分节”,不能保证实时检测!