当前位置: 技术问答>linux和unix
S/C模式下,SERVER端如何判定某一CLIENT是否已断开(包括非正常断开)?
来源: 互联网 发布时间:2015-02-07
本文导语: RT | 用select retval = select( sockfd + 1, &rfds, NULL, NULL, &tv ); if( retval ) { total = ( size_t )read( sockfd, &c, 1 ); if( retval && !total ) { ...
RT
|
用select
retval = select( sockfd + 1, &rfds, NULL, NULL, &tv );
if( retval )
{
total = ( size_t )read( sockfd, &c, 1 );
if( retval && !total )
{
// 当select返回> 0但是 read为0,说明客户端强制断开。
}
}
retval = select( sockfd + 1, &rfds, NULL, NULL, &tv );
if( retval )
{
total = ( size_t )read( sockfd, &c, 1 );
if( retval && !total )
{
// 当select返回> 0但是 read为0,说明客户端强制断开。
}
}
|
方法是 用select函数来获取事件,它可以获取断开事件
但这个方法有个缺点,如果你去手动拔了线,在某些
操作系统中无法获的该事件(似乎SCO-UNIX无法获得这样情况下的事件
windows2000/XP可以,9X/ME系统不可以)
(如果对方异常断电后close系统可以知道该事件)
这个方法普遍使用,可靠性和稳定性高
为避免我上面说的缺点,最好记下对方IP,隔一段时间ping一下它
那可以避免人为把线断了这样的情况,但是可能资源占用较大
但这个方法有个缺点,如果你去手动拔了线,在某些
操作系统中无法获的该事件(似乎SCO-UNIX无法获得这样情况下的事件
windows2000/XP可以,9X/ME系统不可以)
(如果对方异常断电后close系统可以知道该事件)
这个方法普遍使用,可靠性和稳定性高
为避免我上面说的缺点,最好记下对方IP,隔一段时间ping一下它
那可以避免人为把线断了这样的情况,但是可能资源占用较大
|
但有些是检测不倒的
最好使用轮训消息,心跳函数
从协议上保证,这样更完整
最好使用轮训消息,心跳函数
从协议上保证,这样更完整