В чем могут быть причины отказа соединения при отказе? - PullRequest
87 голосов
/ 25 февраля 2010

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

connection refused

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

Ответы [ 11 ]

73 голосов
/ 25 февраля 2010

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

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

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

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

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

62 голосов
/ 02 марта 2010

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

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

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

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

16 голосов
/ 30 апреля 2014

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

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

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

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

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

   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.
8 голосов
/ 25 февраля 2010

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

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

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

5 голосов
/ 25 февраля 2010

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

телнет localhost 2080

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

1 голос
/ 24 марта 2017

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
1 голос
/ 15 января 2013

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

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

и

arping <ipaddress>

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

0 голосов
/ 14 мая 2017

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

0 голосов
/ 03 октября 2016

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

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

Тихие сбои - это здорово!

0 голосов
/ 21 августа 2013

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...