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


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

connection refused

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

11 70

11 ответов:

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

  1. порт не открыт на целевой машине.

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

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

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

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

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

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

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

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

  1. вы отправили пакет TCP SYN на другой хост.
  2. затем вы получили первый пакет TCP в ответ.

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

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

SYN-ПОЛУЧЕННОЕ СОСТОЯНИЕ

   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.

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

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

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

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

telnet localhost 2080

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

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

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

и

arping <ipaddress>

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

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

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

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

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

В Ubuntu, Попробуйте sudo ufw allow <port_number> чтобы разрешить доступ брандмауэра к вашему серверу и БД.

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

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

тихие неудачи велики!