本文共 1178 字,大约阅读时间需要 3 分钟。
1、心跳包
2、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)
-
-
- 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;
-
-
- inKeepAlive.onoff = 1;
-
- inKeepAlive.keepaliveinterval = 5000;
-
- 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());
- }
- }
转载地址:http://npemi.baihongyu.com/