- 论坛徽章:
- 0
|
我把这个心跳机制放在线程里
但是我要从标识符集里面删除客户端的FD,并关闭FD端口,这个字符集又不能在线程里改,这该怎么办?
程序如下
void socket_set_keepalive (int fd)
{
int ret, error, flag, alive, idle, cnt, intv;
/* Set: use keepalive on fd */
alive = 1;
idle = 10;
intv = 5;
cnt = 3;
while(1)
{
if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &alive,sizeof (alive)) != 0)
{
log_warn ("Set keepalive error: %s.\n", strerror (errno));
return -1;
}
/* 10秒钟无数据,触发保活机制,发送保活包 */
if (setsockopt (fd, SOL_TCP, TCP_KEEPIDLE, &idle, sizeof (idle)) != 0)
{
log_warn ("Set keepalive idle error: %s.\n", strerror (errno));
return -1;
}
/* 如果没有收到回应,则5秒钟后重发保活包 */
if (setsockopt (fd, SOL_TCP, TCP_KEEPINTVL, &intv, sizeof (intv)) != 0)
{
log_warn ("Set keepalive intv error: %s.\n", strerror (errno));
return -1;
}
/* 连续3次没收到保活包,视为连接失效 */
if (setsockopt (fd, SOL_TCP, TCP_KEEPCNT, &cnt, sizeof (cnt)) != 0)
{
log_warn ("Set keepalive cnt error: %s.\n", strerror (errno));
return -1;
}
}
} |
|