您的位置 首页 技术

golang判断tcp是否断开的方法

golang判断tcp是否断开的方法: keepalive检测,对于设置了keepalive来说,当tcp检测到对端socket不再可用时(不能发出探测包,或探测包没有收到ACK的…

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是否断开的方法的详细内容,更多请关注24课堂在线网其它相关文章!

本文来自网络,不代表24小时课堂在线立场,转载请注明出处:https://www.24ketang.cn/16477.html

为您推荐

返回顶部