gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:48:25 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com