在线用户监控

为了实现在线用户列表定时刷新,需要及时反映用户是否在线。

我尝试过用WSAIoctl()设置SIO_KEEPALIVE_VALS,可是返回的tcp_keeplive结构体的后两个参数都是0.不知为何原因。我写的代码如下:

#include <Winsock2.h>
#include <stdio.h>
#include <winsock.h>
#include <mswsock.h>
//#include <mstcpip.h>
 struct   tcp_keepalive   {  
          u_long     onoff;  
          u_long     keepalivetime;  
          u_long     keepaliveinterval;  
  };  
#define   SIO_RCVALL                   _WSAIOW(IOC_VENDOR,1)  
#define   SIO_RCVALL_MCAST             _WSAIOW(IOC_VENDOR,2)  
#define   SIO_RCVALL_IGMPMCAST         _WSAIOW(IOC_VENDOR,3)  
#define   SIO_KEEPALIVE_VALS           _WSAIOW(IOC_VENDOR,4)  
#define   SIO_ABSORB_RTRALERT          _WSAIOW(IOC_VENDOR,5)  
#define   SIO_UCAST_IF                 _WSAIOW(IOC_VENDOR,6)  
#define   SIO_LIMIT_BROADCASTS         _WSAIOW(IOC_VENDOR,7)  
#define   SIO_INDEX_BIND               _WSAIOW(IOC_VENDOR,8)  
#define   SIO_INDEX_MCASTIF            _WSAIOW(IOC_VENDOR,9)  
#define   SIO_INDEX_ADD_MCAST          _WSAIOW(IOC_VENDOR,10)  
#define   SIO_INDEX_DEL_MCAST          _WSAIOW(IOC_VENDOR,11)  
//#define   ECONNRESET                   "104"                   /* Connection reset by peer*/
//#define   ETIMEDOUT                    "110"                   /* Connection timed out */
//#define   EHOSTUNREACH                 "113"                   /* No route to host */

#define   ECONNRESET                   WSAECONNRESET
#define   EHOSTUNREACH                 WSAEHOSTUNREACH
#define   ETIMEDOUT                    WSAETIMEDOUT
void main()
{
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 
 wVersionRequested = MAKEWORD( 2, 2 );
 
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 ) {
  return;
 }


 if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 ) {
  WSACleanup( );
  return;
 }
 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(6000);

 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

 listen(sockSrv,5);
 

 SOCKADDR_IN addrClient;
 int len=sizeof(SOCKADDR);

     SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
     int iRET;
     DWORD dwError = 0L ;
     struct tcp_keepalive sKA_Settings = {0}, sReturned = {0} ;
     sKA_Settings.onoff = 1 ;
     sKA_Settings.keepalivetime = 5500 ; // Keep Alive in 5.5 sec.
     sKA_Settings.keepaliveinterval = 3000 ; // Resend if No-Reply         
    
       DWORD dwBytes = 0L ;
    if ((iRET=WSAIoctl(sockConn, SIO_KEEPALIVE_VALS, &sKA_Settings,
          sizeof(sKA_Settings), NULL,0, &dwBytes,NULL, NULL))== SOCKET_ERROR)
    {
           return;
    }
       printf("%d/n",iRET);
       WSAIoctl(sockConn, SIO_KEEPALIVE_VALS, &sKA_Settings,
        sizeof(sKA_Settings), &sReturned, sizeof(sReturned), &dwBytes,NULL, NULL);
       printf("%d,%d/n",sReturned.keepalivetime,sReturned.keepaliveinterval); 
     
      
}

 

输出值为:

0

0,0

说明返回的sReturned.keepalivetime=0,sReturned.keepaliveinterval=0.为什么会这样?

请各位前辈高人指教!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值