概述:Socket 保活

 
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;
	}
 
}