【问题标题】:How to detect dead client with keepalive option enabled如何在启用 keepalive 选项的情况下检测死客户端
【发布时间】:2013-10-30 17:14:14
【问题描述】:

正如我在标题中提到的,我正在使用 keepalive 选项来检测服务器端的死客户端。在连接的 tcp 套接字上启用 keepalive 的代码 sn-p 如下所示。其他操纵 keepalive 行为的选项,如 TCP_KEEPCNT、TCP_KEEPIDLE、TCP_KEEPINTVL 等,默认为系统。

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 调用中,等待客户端向服务器发送命令。代码 sn-p 看起来像这样。

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”中读取它并确保客户端已死。谢谢。

【问题讨论】:

  • 为什么不试试呢?你不能在另一个盒子上连接一个客户端,拔掉盒子然后等着看会发生什么吗?
  • 我试过了,将客户端连接到服务器,然后断开服务器的 LAN 电缆与网络的连接。 keepalive超时后,调用t0 recv()返回错误,errno设置为110即连接超时。

标签: sockets tcplistener keep-alive tcpserver setsockopt


【解决方案1】:

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

-1,errno. 具有适当的值

或者它是否对系统错误变量设置了错误

是的。

【讨论】:

    猜你喜欢
    • 2019-12-17
    • 2011-09-14
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多