繁体   English   中英

尝试连接套接字时ECONNABORTED意味着什么?

[英]What does ECONNABORTED mean when trying to connect a socket?

我在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内核源代码插槽代码的两个位置。

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

#define ECONNABORTED 103 /* Software caused connection abort */

一个是在accept4中定义系统调用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

第二个是在inet_stream_connect中定义符号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;

逻辑的相关解释如下。

具有跳转到的唯一代码sock_error在标签inet_stream_connect是检查,看看如果套接字是由RST,超时,其他进程或错误关闭。

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

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

请参阅errno的手册页。 在FreeBSD上你可以找到它作为intro (2)。 它说:

53 ECONNABORTED软件导致连接中止。 连接中止是在主机内部引起的。

至于为什么会发生这种情况,你必须在Linux内核源代码中查找套接字。 在FreeBSD上只accept似乎返回ECONNABORTED。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM