如何通过对等#34捕获"连接重置; C套接字错误?

时间:2014-07-23 17:20:02

标签: c++ c sockets recv

我有一个C ++和Qt应用程序,它的一部分实现了C套接字客户端。前段时间由于应用程序崩溃,因为服务器发生了一些事情;我从崩溃中得到的唯一一件事是Qt Creator的应用程序输出中的消息说明

  

recv_from_client:通过对等方重置连接

我在网上做了一些关于这个“同步连接重置”错误的研究,而SO和其他地方的一些线程确实设法解释了发生了什么,没有人告诉如何处理它 - 也就是说,如何“捕获”错误并继续我的应用程序而不会崩溃(特别是我从服务器读取的方法是在while循环中,所以我想停止while循环并进入我的代码的另一个地方,将尝试重新建立连接。)

那我怎么能抓住这个错误来适当地处理呢?不要忘记我的代码实际上是带有Qt的C ++ - C部分是一个调用套接字方法的库。

修改

顺便说一下,发生崩溃的可能方法(给出上面错误消息的“recv_from_client”部分)是:

int hal_socket_read_from_client(socket_t *obj, u_int8_t *buffer, int size)
{
    struct s_socket_private * const socket_obj = (struct s_socket_private *)obj;
    int retval = recv(socket_obj->client_fd, buffer, size, MSG_DONTWAIT); //last = 0

    if (retval < 0)
        perror("recv_from_client");

    return retval;
}

注意:我不确定在发生此错误时,recv配置是使用 MSG_DONTWAIT 还是使用 0

2 个答案:

答案 0 :(得分:2)

只需在errno返回否定结果时检查read()

通常不会发生崩溃。

while (...) {
    ssize_t amt = read(sock, buf, size);
    if (amt > 0) {
        // success
    } else if (amt == 0) {
        // remote shutdown (EOF)
    } else {
        // error

        // Interrupted by signal, try again
        if (errno == EINTR)
            continue;

        // This is fatal... you have to close the socket and reconnect
        // handle errno == ECONNRESET here

        // If you use non-blocking sockets, you also have to handle
        // EWOULDBLOCK / EAGAIN here

        return;
    }
}

答案 1 :(得分:0)

它不是异常或信号。你无法抓住它。相反,您会收到一个错误,告诉您在尝试处理该套接字时已重置连接。

int rc = recv(fd, ..., ..., ..., ...);

if (rc == -1)
{ 
  if (errno == ECONNRESET)
    /* handle it; there isn't much to do, though.*/
  else
     perror("Error while reading");
}

正如我所写,你无能为力。如果您正在使用某些I / O多路复用器,则可能需要从进一步监视中删除该文件描述符。