XP下本机测试. 直接关闭客户端进程而不调用closesocket, 但是服务器端还是能收到关闭的事件通知, 奇怪? 客户端用的是CSocket, 我猜想是析构时自动关闭了吧?
按照网上的资料在服务器端打开Keep Alive如下: BOOL bKeepAlive = TRUE;
int nRet = ::setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&bKeepAlive, sizeof(bKeepAlive));
if (nRet !=0)
{
return false;
}
//设置KeepAlive检测时间和次数
tcp_keepalive inKeepAlive = {0}; //输入参数
unsigned long ulInLen = sizeof(tcp_keepalive);
tcp_keepalive outKeepAlive = {0}; //输出参数
unsigned long ulOutLen = sizeof(tcp_keepalive);
unsigned long ulBytesReturn = 0; //设置socket的keep alive为10秒,并且发送次数为3次
inKeepAlive.onoff = 1;
inKeepAlive.keepaliveinterval = 10000; //两次KeepAlive探测间的时间间隔
inKeepAlive.keepalivetime = 3; //开始首次KeepAlive探测前的TCP空闭时间 nRet = WSAIoctl(socket,
SIO_KEEPALIVE_VALS,
(LPVOID)&inKeepAlive,
ulInLen,
(LPVOID)&outKeepAlive,
ulOutLen,
&ulBytesReturn,
NULL,
NULL);
if(SOCKET_ERROR == nRet)
{
return false;
}
return true;
设置隔10秒共发3次. 函数返回的是true在客户端connect成功后,我让其sleep 起来, 但是服务器端在经过几分钟后没能自动断开连接(没有socket关闭的事件通知). 为什么? 还需要怎么做?
按照网上的资料在服务器端打开Keep Alive如下: BOOL bKeepAlive = TRUE;
int nRet = ::setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&bKeepAlive, sizeof(bKeepAlive));
if (nRet !=0)
{
return false;
}
//设置KeepAlive检测时间和次数
tcp_keepalive inKeepAlive = {0}; //输入参数
unsigned long ulInLen = sizeof(tcp_keepalive);
tcp_keepalive outKeepAlive = {0}; //输出参数
unsigned long ulOutLen = sizeof(tcp_keepalive);
unsigned long ulBytesReturn = 0; //设置socket的keep alive为10秒,并且发送次数为3次
inKeepAlive.onoff = 1;
inKeepAlive.keepaliveinterval = 10000; //两次KeepAlive探测间的时间间隔
inKeepAlive.keepalivetime = 3; //开始首次KeepAlive探测前的TCP空闭时间 nRet = WSAIoctl(socket,
SIO_KEEPALIVE_VALS,
(LPVOID)&inKeepAlive,
ulInLen,
(LPVOID)&outKeepAlive,
ulOutLen,
&ulBytesReturn,
NULL,
NULL);
if(SOCKET_ERROR == nRet)
{
return false;
}
return true;
设置隔10秒共发3次. 函数返回的是true在客户端connect成功后,我让其sleep 起来, 但是服务器端在经过几分钟后没能自动断开连接(没有socket关闭的事件通知). 为什么? 还需要怎么做?
Csocket析构的时候应该是会去断开的吧. 你试试强制终结进程的方式,看看还能收到不?
还有注意看看 socket断开了记得close然后要用还得重新初始化.
不过强制关闭进程 Windows系统也会强制回收了那些socket的,服务端一样会收到关闭连接的通知。
要想不通知,只有让系统崩溃或者直接断电或者拔掉网线。