Я пытаюсь написать серверную программу в C, используя другой клиент, я получаю эту ошибку, когда пытаюсь подключиться через порт 2080, например.
connection refused
Каковы могут быть причины этой ошибки?
Я пытаюсь написать серверную программу в C, используя другой клиент, я получаю эту ошибку, когда пытаюсь подключиться через порт 2080, например.
connection refused
Каковы могут быть причины этой ошибки?
Может быть много причин, но наиболее распространенными являются:
Порт не открыт на конечной машине.
Порт открыт на конечной машине, но его отставание от ожидающих соединений заполнено.
Брандмауэр между клиентом и сервером блокирует доступ (также проверяет локальные брандмауэры).
После проверки брандмауэров и открытия порта используйте telnet для подключения к ip/port для проверки возможности подключения. Это устраняет любые потенциальные проблемы из вашего приложения.
Ошибка означает, что ОС прослушивающего сокета распознала запрос входящего соединения, но предпочла его намеренно отклонить.
Предполагая, что промежуточный брандмауэр не мешает, есть только две причины (я знаю), чтобы ОС отклонила запрос входящего соединения. Одна из причин уже упоминалась несколько раз - подключаемый порт прослушивания не открыт.
Есть еще одна причина, о которой еще не упоминалось, - прослушивающий порт фактически открыт и активно используется, но его отставание от запросов на входящее соединение в очереди достигло максимума, поэтому нет места для запроса входящего соединения поставил в очередь в тот момент. Код сервера еще не вызвал accept(), чтобы завершить очистку доступных слотов для новых элементов очереди.
Подождите некоторое время и повторите попытку. К сожалению, нет никакого способа различать "порт не открыт вообще" и "порт открыт, но слишком занят прямо сейчас". Они оба используют один и тот же общий код ошибки.
Если вы попытаетесь открыть TCP-соединение с другим хостом и увидите сообщение об ошибке "Соединение отказано", это означает, что
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.
Отклонено соединение означает, что порт, к которому вы пытаетесь подключиться, на самом деле не открыт.
Таким образом, либо вы подключаетесь к неправильному 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
С точки зрения брандмауэра Checkpoint вы увидите сообщение от брандмауэра, если вы на самом деле выбираете "Отклонить как действие", тем самым предоставляя предполагаемому злоумышленнику наличие брандмауэра перед сервером. Брандмауэр отключит все соединения, которые не соответствуют политике. Соединение отказалось почти всегда с сервера
У меня такая же проблема с моим рабочим компьютером. Проблема в том, что когда вы вводите localhost, он переходит к прокси-адресу, а не локальному адресу, который вы должны его обойти, выполните следующие действия.
Chrome = > Настройки = > Изменить настройки прокси-сервера = > Настройки локальной сети = > проверить прокси-сервер обхода для локальных адресов.
В Ubuntu, попробуйте
sudo ufw allow <port_number>
для доступа к брандмауэру на ваш сервер и db.
Попробуйте передать параметр порта "-p":
sudo iperf -c 127.0.0.1 -p 443
У меня было то же сообщение с совершенно другой причиной: wsock32.dll
не найден. Вызов ::socket(PF_INET, SOCK_STREAM, 0);
продолжал возвращать INVALID_SOCKET
, но причина в том, что dll winsock не была загружена.
В конце я запустил монитор процессов Sysinternals и заметил, что он искал DLL "везде", но не нашел его.
Бесшумные отказы - это здорово!