如何在C套接字中捕获“通过对等方重置连接”错误?

我有一个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

只需在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; } } 

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

 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多路复用器,则可能需要从进一步监视中删除该文件描述符。