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


114

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

connection refused

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


Я получил эту ошибку из-за ошибки сервера, на котором я размещаю свой сайт. Сервер все еще можно редактироватьping , downforeveryoneorjustme.com показал, что это не только я, и я все еще могу получить к нему доступ через FTP. Через пару минут ошибка была исправлена.
Мартин Тома

2
@moose: ping не сообщает вам, доступен ли конкретный порт для прослушивания рекламы, а только то, доступен ли IP-адрес. Но connect()зависит от конкретного IP и порта, готового к использованию.
Реми Лебо

В Server Fault есть канонический вопрос об отказе в подключении .
Raedwald

Вот краткое объяснение отказа в подключении .
rbinnun

Мне было отказано в соединении на Ubuntu, потому что я пытался получить соединение на «localhost», но «localhost» не был правильно настроен на моей машине. Замена localhost на "" (Python) решила проблему.
user1097111

Ответы:


94

Причин может быть много, но самые распространенные:

  1. Порт не открыт на целевом компьютере.

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

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

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


7
Межсетевые экраны обычно выдают ошибки тайм-аута, так как пакет подключения (SYN) просто отбрасывается. В соединении отказано, потому что сервер получил и отклонил пакет SYN.
RedPandaCurios,

15
Не всегда, поскольку брандмауэры можно настроить так, чтобы они отклоняли, а не отбрасывали пакеты.
2010,

connect () с неправильным IP-адресом сервера и конфигурацией номера порта в клиентской программе также приведет к
ошибке

Кроме того: когда вам нужно получить доступ к https, но вы указали http: // ... эта ошибка также может возникнуть.
Fico

4
@ a'r Как узнать статус невыполненной работы?
Навин Верма

75

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

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

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

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


4
Здесь также объясняется один крайний случай: softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/… . в основном, если вы проводите стресс-тестирование своего клиент-серверного приложения и используете наивный подход, упомянутый в 3.6, может произойти ошибка «соединение отклонено», и это другой случай, чем два вышеупомянутых.
ernesto

За это нужно проголосовать. Как только очевидная причина (отсутствие прослушивания) была устранена, это фактически наиболее вероятное объяснение, и ее устранение может быть сложной задачей.
Грэм Николлс

если очередь входящих запросов в очереди достигла максимума, как мы можем это исправить?
ACarter

очередь невыполненных работ по IP? Я попытался использовать telnet email-smtp.eu-west-1.amazonaws.com 25 из экземпляра EC2 и моего локального компьютера, вызов telnet экземпляра EC2 дает отказ в соединении, в то время как с моего локального компьютера он работает
dresh

"ничего не слушает", вероятно, вызвано тем, что машина работает, но сервер (программное обеспечение), например Apache, не работает.
ttulinsky

24

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

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

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

См. Https://tools.ietf.org/html/rfc793, стр. 69:

СОСТОЯНИЕ СИНХРОНИЗАЦИИ

Если установлен бит RST

Если это соединение было инициировано с пассивным ОТКРЫТОМ (т. Е. Вышло из состояния LISTEN), верните это соединение в состояние LISTEN и вернитесь. Информировать пользователя не нужно. Если это соединение было инициировано с активным OPEN (т. Е. Пришло из состояния SYN-SENT), то соединение было отклонено, сигнализируя пользователю «соединение отклонено». В любом случае следует удалить все сегменты очереди на повторную передачу. А в активном случае ОТКРЫТО войдите в состояние ЗАКРЫТО, удалите TCB и вернитесь.


11

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

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

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


4
Это лишь одно из нескольких возможных условий, которые могут вызвать ошибку.
Реми Лебо

1
Порт может быть открыт, но эта ошибка все равно может возникнуть.
Игорь Ганапольский

6

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

telnet localhost 2080

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


3

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

netstat -a помог
Филипп

1

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

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

и

arping <ipaddress>

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


0

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


0

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

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


0

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



0

В моем случае это происходит, когда сайт заблокирован в моей стране, и я не использую VPN. Например, когда я пытаюсь получить доступ к vimeo.com из Индонезии, который заблокирован.


-1

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

В конце концов я запустил монитор процессов Sysinternals и заметил, что он ищет dll «везде», но не находит.

Тихие неудачи - это здорово!


1
INVALID_SOCKET не имеет ничего общего с «в соединении отказано». «Тихие сбои» могут возникать только в том случае, если в вашем коде отсутствует необходимая обработка ошибок.
Маркиз Лорн

1
Вы имеете в виду, что я должен был проверить, загружена ли DLL? ты наверное прав.
xtofl
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.