- 论坛徽章:
- 0
|
我觉得LZ既然是做TCP的SERVER,而且有这样大的访问量,不应该不做TCPKEEPALIVE的操作,而且要把BACKLOG增加到500或者更大。。
感觉LZ的问题,就是因为很多用户在保持与LZ的SERVER连接的时候,直接关机器或者拔网络线,都会操作你这边出现一个死连接。
默认的情况下, LINUX或经过大概7200秒才会回收这个FD,这样肯定会影响你的服务的。
我贴段KEEPALIVE的代码, 希望对LZ有帮助:
# include <netinet/tcp.h>
int keepalive; // 打开TCP KEEPALIVE开关
int keepidle; // 系统等待多长时间开始检测
int keepintvl; // 系统每次探测时间
int keepcnt; // 系统探测几次后执行关闭操作。
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char*)&keepalive, sizeof(keepalive));
isetsockopt(fd, SOL_TCP, TCP_KEEPIDLE, (char *)&keepidle, sizeof(keepidle));
setsockopt(fd, SOL_TCP, TCP_KEEPINTVL,(char *)&keepintvl, sizeof(keepintvl));
setsockopt(fd, SOL_TCP, TCP_KEEPCNT,(char *)&keepcnt, sizeof(keepcnt));
这个功能是协议栈实现的,应用层不用关心,但当发生检测失败后,他会叫你的epoll函数。 |
|