2013-10-30 24 views
0

正如我在标题中提到的,我使用keepalive选项来检测服务器端的死客户端。在连接的tcp套接字上启用keepalive的代码片段如下所示。其他操作Keepalive行为的选项,如TCP_KEEPCNT,TCP_KEEPIDLE,TCP_KEEPINTVL等,都是默认情况下的系统。如何使用keepalive选项启用检测死客户端

int optval; 
socklen_t optlen = sizeof(optval); 
if(setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) { 
    perror("setsockopt()"); 
    close(s); 
    exit(EXIT_FAILURE); 
} 

在服务器端,在连接的套接字上,服务器线程将在recv调用中,等待客户端向服务器发送命令。这段代码片段看起来像这样。

for(; dwBytesReceived < dwBlockSize; dwBytesReceived += iByteCount) { 
retry: 
      iByteCount = recv(m_ConnectSocket, ((UX_CHAR *)pBlock + dwBytesReceived), (dwBlockSize - dwBytesReceived), flag); 
      if (UX_SUCCESS >= iByteCount) { 
        if (iByteCount == 0) { 
          // Connection from client is unexpectedly closed. Terminate Server instance thread. 
          ret = UX_ECLIENTSHUTDOWN; 
          UX_ERROR("Connection from client is unexpectedly closed. Terminating Server instance thread, errno:%d", UX_ECLIENTSHUTDOWN); 
          goto out; 
        } 
        ret = get_last_sock_error(); 
        if (EAGAIN == ret) { 
          UX_ERROR("The socket is marked non-blocking and the requested operation, recv, would block"); 
          goto retry; 
        } 
        ret = -errno; 
        goto out; 
      } 
} 

当客户端按顺序关闭时,recv调用返回0,并确保客户端已终止。所以我的问题是当keepalive检测到死客户时recv返回什么?或者它是否给系统错误变量设置了一个错误,我可以从“get_last_sock_error”中读取它并确保客户端已经死亡。谢谢。

+0

为什么不尝试呢?你不能在另一个盒子上连接客户端,拔掉盒子并等待看看会发生什么? –

+0

我试过了,连接客户端到服务器,然后断开服务器的局域网电缆连接到网络。 keepalive超时后,调用t0 recv()返回错误,并将errno设置为110,即Connection超时。 –

回答

0

当keepalive检测到死客户时recv返回什么?

-1与适当的值errno.

或不将其设置一个错误的系统错误变量

是。

相关问题