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