c++ - 如何在 C 套接字中捕获 "connection reset by peer"错误?

标签 c++ c sockets recv

我有一个 C++ 和 Qt 应用程序,它的一部分实现了一个 C 套接字客户端。前段时间由于服务器出现问题导致应用程序崩溃;我从那次崩溃中得到的唯一信息是 Qt Creator 的应用程序输出中的一条消息,指出

recv_from_client: Connection reset by peer

我在网上做了一些关于这个“连接被对等重置”错误的研究,虽然 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

最佳答案

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

通常不涉及崩溃。

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;
    }
}

关于c++ - 如何在 C 套接字中捕获 "connection reset by peer"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24916937/

相关文章:

node.js - socket.io-redis 不断抛出 NOAUTH 错误

c - 服务器认为2个不同IP的客户端是同一个客户端(C Socket编程)

c++ - 为什么需要同时使用 fixed 和 showpoint 操纵器来显示小数点和尾随零,而只有 fixed 才能完成这项工作?

c++ - 如何设计相互依赖的策略类实现

c - 了解时间命令的结果

c - 如何修改已传递给 C 函数的指针?

c - 当我创建一个新的用户空间线程时,它会出现在内核进程列表中吗?

c++ - .o 文件与 .a 文件

C++如何将目录中的文件名放入 vector 中?

Java Socket 连接无需 ServerSocket 监听