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关闭的事件通知). 为什么? 还需要怎么做? 

解决方案 »

  1.   

    代码中的socket 是 accept的返回值. keep alive 是设置这个socket, 还是listen socket?
      

  2.   

    socket 应该是套接字的句柄吧. 要设置就是设置这个socket. 
    Csocket析构的时候应该是会去断开的吧. 你试试强制终结进程的方式,看看还能收到不?
    还有注意看看 socket断开了记得close然后要用还得重新初始化.
      

  3.   

    你的 socket 设置了 keepalive 是保持连接不断开,没有 closesocket 服务器端当然认为连接一直存在了。
    不过强制关闭进程 Windows系统也会强制回收了那些socket的,服务端一样会收到关闭连接的通知。
    要想不通知,只有让系统崩溃或者直接断电或者拔掉网线。
      

  4.   

    那我想在本机测试 我的keep alive是否起作用 该怎么测试?