站长资讯网
最全最丰富的资讯网站

golang判断tcp是否断开的方法

golang判断tcp是否断开的方法

golang判断tcp是否断开的方法:

keepalive检测,对于设置了keepalive来说,当tcp检测到对端socket不再可用时(不能发出探测包,或探测包没有收到ACK的响应包),select会返回socket可读,并且在recv时返回-1,同时置上errno为ETIMEDOUT。此时TCP的状态是断开的。

struct TCP_KEEPALIVE {       unsigned long onoff;       unsigned long keepalivetime;       unsigned long keepaliveinterval;   } ;      #define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)      /* KeepAlive实现 */   void set_keepalive (SOCKET s)   {       BOOL bKeepAlive = TRUE;       int nRet = ::setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (char*)&bKeepAlive, sizeof(bKeepAlive));       if (nRet == SOCKET_ERROR)       {           return ;       }       /* 输入参数 */       struct TCP_KEEPALIVE inKeepAlive = {0};        unsigned long ulInLen = sizeof(struct TCP_KEEPALIVE);          /* 输出参数 */       struct TCP_KEEPALIVE outKeepAlive = {0};        unsigned long ulOutLen = sizeof(struct TCP_KEEPALIVE);       unsigned long ulBytesReturn = 0;       int ret = 0;          /* 设置keepalive 为5秒,并且发送次数为3次 */       inKeepAlive.onoff             = 1;       /* 2次keepalive探测间隔时间 */       inKeepAlive.keepaliveinterval = 5000;        /* 开始首次keepalive探测前的tcp空闲时间 */       inKeepAlive.keepalivetime     = 5000;           ret = WSAIoctl((unsigned int)s,               SIO_KEEPALIVE_VALS,               (LPVOID)&inKeepAlive,                ulInLen,               (LPVOID)&outKeepAlive,                ulOutLen,               &ulBytesReturn,                NULL,                NULL);       if (ret == SOCKET_ERROR)       {           printf ("error: %dn", WSAGetLastError());       }   }

赞(0)
分享到: 更多 (0)
网站地图   沪ICP备18035694号-2    沪公网安备31011702889846号