golang判断tcp是否断开的方法

互联网 19-12-17

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: %d\n", WSAGetLastError());       }   }

更多golang知识请关注golang教程栏目。

以上就是golang判断tcp是否断开的方法的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: TCP
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:golang recover后怎么返回

相关资讯