我在 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/