S/C模式下,SERVER端如何判定某一CLIENT是否已断开(包括非正常断开)?

RT
---------------------------------------------------------------

方法是 用select函数来获取事件,它可以获取断开事件
但这个方法有个缺点,如果你去手动拔了线,在某些
操作系统中无法获的该事件(似乎SCO-UNIX无法获得这样情况下的事件
windows2000/XP可以,9X/ME系统不可以)
(如果对方异常断电后close系统可以知道该事件)
这个方法普遍使用,可靠性和稳定性高

为避免我上面说的缺点,最好记下对方IP,隔一段时间ping一下它
那可以避免人为把线断了这样的情况,但是可能资源占用较大
---------------------------------------------------------------

用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,说明客户端强制断开。
}
}

---------------------------------------------------------------

但有些是检测不倒的
最好使用轮训消息,心跳函数
从协议上保证,这样更完整

Published At
Categories with 服务器类
Tagged with
comments powered by Disqus