python - 尝试连接套接字时 ECONNABORTED 是什么意思?

标签 python sockets

我在 ubuntu 机器上使用 python 2.7。

客户端尝试连接到服务器。我得到一个 EINPROGRESS,这是非阻塞套接字所期望的。

为了检查连接是否成功,我按照 {connect} 手册页的建议进行操作:

# EINPROGRESS The socket is nonblocking and the connection cannot be
# completed immediately.  It is possible to select(2) or poll(2) for
# completion by selecting the socket for writing.  After select(2)
# indicates writability, use getsockopt(2) to read the SO_ERROR option at
# level SOL_SOCKET to determine whether connect() completed successfully
# (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual error
# codes listed here, explaining the reason for the failure)

当服务器离线时,这给了我一个 ECONNREFUSED。到目前为止一切顺利。

当连接失败时,我想重试几次。

问题:我第二次尝试连接同一个套接字时,{connect} 向我发送了 ECONNABORTED。这不在 {connect} 的手册页中。什么意思?

最佳答案

ECONNABORTED 在 Linux Kernel Source Socket Code 的两处设置。

根据 errno 手册页和 /include/asm-generic/errno.h

#define ECONNABORTED 103/* 软件导致连接中止 */

first位于 /net/socket.c 中定义系统调用 accept4 的函数中。

相关源码

1533         if (upeer_sockaddr) {
1534                 if (newsock->ops->getname(newsock, (struct sockaddr *)&address,
1535                                           &len, 2) < 0) {
1536                         err = -ECONNABORTED;
1537                         goto out_fd;
1538                 }
1539                 err = move_addr_to_user((struct sockaddr *)&address,
1540                                         len, upeer_sockaddr, upeer_addrlen);
1541                 if (err < 0)
1542                         goto out_fd;
1543         }

相关逻辑解释如下。

如果定义了来自用户空间的对等套接字的地址 如果新套接字没有名称,则将错误状态设置为 ECONNABORTED 并转到标签 out_fd

second/net/ipv4/af_inet.c 中定义符号 inet_stream_connect 的函数中。

相关源码

645         /* Connection was closed by RST, timeout, ICMP error
646          * or another process disconnected us.
647          */
648         if (sk->sk_state == TCP_CLOSE)
649                 goto sock_error; 

662 sock_error:
663         err = sock_error(sk) ? : -ECONNABORTED;
664         sock->state = SS_UNCONNECTED;
665         if (sk->sk_prot->disconnect(sk, flags))
666                 sock->state = SS_DISCONNECTING;
667         goto out;

相关逻辑解释如下。

inet_stream_connect 中唯一转到sock_error 标签的代码是检查套接字是否被 RST、超时、另一个进程或错误关闭。

sock_error标签中 如果我们可以恢复套接字错误报告,则执行此操作,否则错误状态为 ECONNABORTED

Celada 的评论一样,我也建议每次都打开一个新的套接字。

关于python - 尝试连接套接字时 ECONNABORTED 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9646550/

相关文章:

python - 将列表转换为 DataFrame 时如何处理错误 "' NoneType' object has no attribute 'keys' "

python - 如何设置具有任意运行次数的 Tensorboard?

c# - 为什么读取配置了TcpListener的套接字时没有收到数据?

windows - 我一次可以打开多少个 TCP 套接字?

python - 2 条轨迹的 Fréchet 距离

python - 合并两个几乎相同的字符串

c - 非阻塞 TCP 套接字处理 - 如何在写入套接字之前检测阻塞状态?

c - EAGAIN 是什么意思?

python - 如何使用 *args 和 **kwargs 注释可调用对象?

c - AF_XDP : `BPF_MAP_TYPE_XSKMAP` only has entries with `Operation not supported`