概述:Socket 保活

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

BOOL _KeepAlive(SP_SOCKET fd)
{
//定义结构及宏
struct KeepAlive
{
u_long onoff;
u_long keepalivetime;
u_long keepaliveinterval;
};


#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)

//KeepAlive实现
KeepAlive inKeepAlive = { 0 }; //输入参数
unsigned long ulInLen = sizeof(KeepAlive);

KeepAlive outKeepAlive = { 0 }; //输出参数
unsigned long ulOutLen = sizeof(KeepAlive);
unsigned long ulBytesReturn = 0;

//keepalive xp以前的系统发送5次,xp之后的系统发送10
inKeepAlive.onoff = 1;
inKeepAlive.keepaliveinterval = 5000; //两次KeepAlive探测间的时间间隔
inKeepAlive.keepalivetime = 5000; //开始首次KeepAlive探测前的TCP空闭时间

if (WSAIoctl((SOCKET)fd, SIO_KEEPALIVE_VALS,
(LPVOID)&inKeepAlive, ulInLen,
(LPVOID)&outKeepAlive, ulOutLen,
&ulBytesReturn, NULL, NULL) == SOCKET_ERROR)
{
LOGT("Set Keep Alive FAILED.");
return FALSE;
}
else
{
LOGT("Set Keep Alive OK.");
return TRUE;
}

}