程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于2019-10-07 19:27     阅读(3994)     评论(0)     点赞(1)     收藏(4)


我在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 /* Software caused connection abort */

一个accept4/net/socket.c中定义syscall的函数

相关源代码

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/net/ipv4/af_inet.c

相关源代码

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的评论一样,我也建议每次打开一个新的套接字。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/133140/2349418f97111a636d41/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

1 0
收藏该文
已收藏

评论内容:(最多支持255个字符)