- 论坛徽章:
- 0
|
回复 #1 yangsf5 的帖子
再man epoll_ctl看下后两个事件的说明,这两个应该是本端(server端)出错才触发的。
EPOLLERR事件:客户端用VC 写得,程序运行,发完消息后让程序sleep 然后直接关闭dos 小黑框的关闭按钮,服务端就会触发EPOLLERR事件。
在服务的程序里加上
int keepAlive = 1; // 开启keepalive属性
int keepIdle = 18; // 如该连接在18秒内没有任何数据往来,则进行探测
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.
setsockopt(Accept_sd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive)) ;
setsockopt(Accept_sd, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle)) ;
setsockopt(Accept_sd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval)) ;
setsockopt(Accept_sd, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount)) ;
如果拔掉网线就可以在自己设定的时间内检测到 EPOLLERR事件
[ 本帖最后由 liujq110 于 2009-3-13 15:33 编辑 ] |
|