在服務器端打開keepalive功能
1、保證LWIP_TCP_KEEPALIVE被定義為1,(這樣TCP_KEEPIDLE、TCP_KEEPINTVL和TCP_KEEPCNT 設置才有效)
2、
int32 keepalive = 1;
int32 keepidle = 1;
int32 keepinterval = 1;
int32 keepcount = 1;
int32 flag = 1;
if(setsockopt(server_socket, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive, sizeof(keepalive)) < 0)// 打開keepalive功能,需要在執行accept()之前執行
{
printf("set keepalive fail");
}
......accept()
setsockopt(accept_ret, IPPROTO_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle));
setsockopt(accept_ret, IPPROTO_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval));
setsockopt(accept_ret, IPPROTO_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount));
setsockopt(accept_ret, IPPROTO_TCP, TCP_NODELAY, (void *)&flag , sizeof(flag));
在客戶端打開keepalive功能(有些情況下keepalive不能正常工作,建議自建心跳包)
1、保證LWIP_TCP_KEEPALIVE被定義過
2、
int32 keepalive = 1;
int32 keepidle = 2;
int32 keepinterval = 2;
int32 keepcount = 2;
int32 flag = 1;
if(setsockopt(sta_socket, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive, sizeof(keepalive)) < 0)// 打開keepalive功能,需要在執行connect()之前執行
{
printf("set keepalive fail");
}
......connect()
setsockopt(sta_socket, IPPROTO_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle));
setsockopt(sta_socket, IPPROTO_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval));
setsockopt(sta_socket, IPPROTO_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount));
setsockopt(sta_socket, IPPROTO_TCP, TCP_NODELAY, (void *)&flag , sizeof(flag));