ECONNABORTED
устанавливается в двух местах исходного кода сокета ядра Linux.
Согласно справочной странице errno
и / include / asm-generic / errno.h
#define ECONNABORTED 103 /* Software caused connection abort */
first находится в функции, которая определяет системный вызов accept4
в / net / socket.c .
Соответствующий исходный код
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 , я также рекомендую каждый раз открывать новый сокет.