Каковы могут быть причины отказа отказались?

Я пытаюсь написать серверную программу в C, используя другой клиент, я получаю эту ошибку, когда пытаюсь подключиться через порт 2080, например.

connection refused

Каковы могут быть причины этой ошибки?

Ответ 1

Может быть много причин, но наиболее распространенными являются:

  • Порт не открыт на конечной машине.

  • Порт открыт на конечной машине, но его отставание от ожидающих соединений заполнено.

  • Брандмауэр между клиентом и сервером блокирует доступ (также проверяет локальные брандмауэры).

После проверки брандмауэров и открытия порта используйте telnet для подключения к ip/port для проверки возможности подключения. Это устраняет любые потенциальные проблемы из вашего приложения.

Ответ 2

Ошибка означает, что ОС прослушивающего сокета распознала запрос входящего соединения, но предпочла его намеренно отклонить.

Предполагая, что промежуточный брандмауэр не мешает, есть только две причины (я знаю), чтобы ОС отклонила запрос входящего соединения. Одна из причин уже упоминалась несколько раз - подключаемый порт прослушивания не открыт.

Есть еще одна причина, о которой еще не упоминалось, - прослушивающий порт фактически открыт и активно используется, но его отставание от запросов на входящее соединение в очереди достигло максимума, поэтому нет места для запроса входящего соединения поставил в очередь в тот момент. Код сервера еще не вызвал accept(), чтобы завершить очистку доступных слотов для новых элементов очереди.

Подождите некоторое время и повторите попытку. К сожалению, нет никакого способа различать "порт не открыт вообще" и "порт открыт, но слишком занят прямо сейчас". Они оба используют один и тот же общий код ошибки.

Ответ 3

Если вы попытаетесь открыть TCP-соединение с другим хостом и увидите сообщение об ошибке "Соединение отказано", это означает, что

  • Вы отправили TCP SYN-пакет другому хосту.
  • Затем вы получили пакет TCP RST в ответ.

RST бит в TCP-пакете, который указывает, что соединение должно быть reset. Обычно это означает, что другой хост получил попытку подключения и активно отказывается от вашего TCP-соединения, но иногда промежуточный брандмауэр может блокировать ваш TCP SYN-пакет и отправлять вам TCP RST.

См. https://tools.ietf.org/html/rfc793 страница 69:

SYN-RECEIVED STATE

   If the RST bit is set

     If this connection was initiated with a passive OPEN (i.e.,
     came from the LISTEN state), then return this connection to
     LISTEN state and return.  The user need not be informed.  If
     this connection was initiated with an active OPEN (i.e., came
     from SYN-SENT state) then the connection was refused, signal
     the user "connection refused".  In either case, all segments
     on the retransmission queue should be removed.  And in the
     active OPEN case, enter the CLOSED state and delete the TCB,
     and return.

Ответ 4

Отклонено соединение означает, что порт, к которому вы пытаетесь подключиться, на самом деле не открыт.

Таким образом, либо вы подключаетесь к неправильному IP-адресу, либо к неправильному порту, либо сервер прослушивает неправильный порт или фактически не работает.

Общей ошибкой не является указание номера порта при привязке или подключении в сетевом порядке байтов...

Ответ 5

Проверьте на стороне сервера, что он прослушивает порт 2080. Сначала попробуйте подтвердить это на серверной машине, отправив telnet на этот порт:

telnet localhost 2080

Если он прослушивает, он может ответить.

Ответ 6

Хотя это не похоже на вашу ситуацию, иногда отказ в соединении может также указывать на наличие конфликта IP-адресов в вашей сети. Вы можете найти возможные конфликты ip, выполнив:

 arp-scan -I eth0 -l | grep <ipaddress>

и

arping <ipaddress>

Этот вопрос AskUbuntu также содержит дополнительную информацию.

Ответ 7

1. Проверьте состояние своего сервера.

2. Проверьте состояние порта.

Например, 3306 netstat -nupl|grep 3306.

3. Проверьте свои брандмауэры. Например, добавьте 3306

vim /etc/sysconfig/iptables
# add
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT

Ответ 8

С точки зрения брандмауэра Checkpoint вы увидите сообщение от брандмауэра, если вы на самом деле выбираете "Отклонить как действие", тем самым предоставляя предполагаемому злоумышленнику наличие брандмауэра перед сервером. Брандмауэр отключит все соединения, которые не соответствуют политике. Соединение отказалось почти всегда с сервера

Ответ 9

У меня такая же проблема с моим рабочим компьютером. Проблема в том, что когда вы вводите localhost, он переходит к прокси-адресу, а не локальному адресу, который вы должны его обойти, выполните следующие действия.

Chrome = > Настройки = > Изменить настройки прокси-сервера = > Настройки локальной сети = > проверить прокси-сервер обхода для локальных адресов.

Ответ 10

В Ubuntu, попробуйте sudo ufw allow <port_number> для доступа к брандмауэру на ваш сервер и db.

Ответ 11

Попробуйте передать параметр порта "-p":

sudo iperf -c 127.0.0.1 -p 443

Ответ 12

У меня было то же сообщение с совершенно другой причиной: wsock32.dll не найден. Вызов ::socket(PF_INET, SOCK_STREAM, 0); продолжал возвращать INVALID_SOCKET, но причина в том, что dll winsock не была загружена.

В конце я запустил монитор процессов Sysinternals и заметил, что он искал DLL "везде", но не нашел его.

Бесшумные отказы - это здорово!