Jakie mogą być przyczyny błędów odmowy połączenia?

114

Próbuję napisać program serwera w C, używając innego klienta, pojawia się ten błąd, gdy próbuję połączyć się na przykład przez port 2080.

connection refused

Jakie mogą być przyczyny tego błędu?

Zenet
źródło
Właśnie dostałem ten błąd z powodu błędu serwera, na którym hostuję swoją witrynę. Serwer nadal można było edytowaćping , downforeveryoneorjustme.com pokazał, że to nie tylko ja i nadal mogę uzyskać do niego dostęp przez FTP. Po kilku minutach błędy zostały naprawione.
Martin Thoma
2
@moose: ping nie informuje, czy określony port jest dostępny i nasłuchuje reklam, a jedynie, czy adres IP jest osiągalny. Ale connect()zależy od konkretnego adresu IP i portu, który jest gotowy do użycia.
Remy Lebeau
Błąd serwera zawiera kanoniczne pytanie dotyczące odmowy połączenia .
Raedwald,
Oto zwięzłe wyjaśnienie odmowy połączenia .
rbinnun
Otrzymałem odmowę połączenia w Ubuntu, ponieważ próbowałem odebrać połączenie na „localhost”, ale „localhost” nie został poprawnie skonfigurowany na moim komputerze. Zmiana „localhost” na „” (Python) rozwiązała problem.
user1097111

Odpowiedzi:

93

Powodów może być wiele, ale najczęściej są to:

  1. Port nie jest otwarty na komputerze docelowym.

  2. Port jest otwarty na maszynie docelowej, ale zaległości oczekujących połączeń są pełne.

  3. Zapora sieciowa między klientem a serwerem blokuje dostęp (sprawdź także zapory lokalne).

Po sprawdzeniu zapory i czy port jest otwarty, użyj telnetu, aby połączyć się z IP / portem, aby przetestować łączność. Spowoduje to usunięcie wszelkich potencjalnych problemów z aplikacji.

a'r
źródło
7
Zapory zwykle powodowałyby błędy przekroczenia limitu czasu, ponieważ pakiet połączenia (SYN) jest właśnie odrzucany. Odmowa połączenia jest spowodowana tym, że serwer odebrał i odrzucił pakiet SYN.
RedPandaCurios
15
Nie zawsze, ponieważ zapory ogniowe można skonfigurować tak, aby odrzucały, a nie odrzucały pakiety.
a'r
connect () z nieprawidłowym adresem IP serwera i konfiguracją numeru portu w programie klienta również spowoduje błąd errno 111.
smRaj
Ponadto: gdy musisz uzyskać dostęp do https, ale podałeś http: // ... ten błąd również może wystąpić.
Fico,
4
@ a'r Skąd znasz stan zaległości?
Naveen Verma
75

Błąd oznacza, że ​​system operacyjny gniazda nasłuchującego rozpoznał żądanie połączenia przychodzącego, ale zdecydował się celowo je odrzucić.

Zakładając, że pośrednia zapora ogniowa nie przeszkadza, są tylko dwa powody (o których wiem), dla których system operacyjny odrzuca żądanie połączenia przychodzącego. Jeden powód był już kilkakrotnie wspominany - port nasłuchu, do którego jest podłączony, jest zamknięty.

Jest jeszcze jeden powód, o którym jeszcze nie wspomniano - port nasłuchujący jest faktycznie otwarty i aktywnie używany, ale jego zaległości w kolejce żądań połączeń przychodzących osiągnęły maksimum, więc nie ma miejsca na kolejkowanie żądań połączeń przychodzących za chwilę. Kod serwera nie wywołał jeszcze wystarczająco dużo razy accept (), aby zakończyć czyszczenie dostępnych miejsc dla nowych elementów kolejki.

Poczekaj chwilę i spróbuj ponownie nawiązać połączenie. Niestety, nie ma sposobu, aby odróżnić „port nie jest w ogóle otwarty” od „port jest otwarty, ale jest teraz zbyt zajęty”. Oba używają tego samego ogólnego kodu błędu.

Remy Lebeau
źródło
4
Jest też jeden wyjątkowy przypadek, jak wyjaśniono tutaj: softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/… . w zasadzie, jeśli testujesz swoją aplikację klient / serwer w warunkach skrajnych i używasz naiwnego podejścia, jak wspomniano w 3.6, może wystąpić błąd „odmowa połączenia”, który jest inny niż dwa powyższe.
ernesto
Należy to poprzeć. Po rozwiązaniu oczywistej przyczyny (brak słuchania) jest to w rzeczywistości najbardziej prawdopodobne wyjaśnienie, a naprawienie tego może być złożoną sprawą.
Graham Nicholls
jeśli liczba oczekujących żądań przychodzących w kolejce osiągnęła maksimum, jak możemy to naprawić?
ACarter
czy zaległości są kolejkowane według adresu IP? Próbowałem użyć telnet email-smtp.eu-west-1.amazonaws.com 25 z instancji EC2 i mojego lokalnego komputera, wywołanie telnet instancji EC2 daje odmowę połączenia, podczas gdy z mojego lokalnego komputera działa
dresh
„Nic nie nasłuchuje” jest prawdopodobnie spowodowane tym, że maszyna jest włączona, ale serwer (oprogramowanie), np. Apache, nie jest uruchomiony.
ttulinsky
24

Jeśli spróbujesz otworzyć połączenie TCP z innym hostem i zobaczysz komunikat o błędzie „Odmowa połączenia”, oznacza to, że

  1. Wysłałeś pakiet TCP SYN do innego hosta.
  2. Następnie w odpowiedzi otrzymałeś pakiet TCP RST.

RST jest bitem w pakiecie TCP, który wskazuje, że połączenie powinno zostać zresetowane. Zwykle oznacza to, że inny host odebrał twoją próbę połączenia i aktywnie odrzuca twoje połączenie TCP, ale czasami interweniująca zapora może zablokować twój pakiet TCP SYN i odesłać do ciebie TCP RST.

Zobacz https://tools.ietf.org/html/rfc793 strona 69:

STAN OTRZYMANIA SYN

Jeśli bit RST jest ustawiony

Jeśli to połączenie zostało zainicjowane z pasywnym OPEN (tj. Pochodzi ze stanu LISTEN), to przywróć to połączenie do stanu LISTEN i wróć. Użytkownik nie musi być informowany. Jeśli to połączenie zostało zainicjowane z aktywnym OPEN (tj. Pochodziło ze stanu SYN-SENT), to połączenie zostało odrzucone, sygnalizuj użytkownikowi „połączenie odrzucone”. W każdym przypadku należy usunąć wszystkie segmenty z kolejki retransmisji. W aktywnym przypadku OTWARTY wprowadź stan ZAMKNIĘTY, usuń TCB i wróć.

James Brock
źródło
11

Odmowa połączenia oznacza, że ​​port, z którym próbujesz się połączyć, nie jest w rzeczywistości otwarty.

Więc albo łączysz się z niewłaściwym adresem IP, albo z niewłaściwym portem, albo serwer nasłuchuje na niewłaściwym porcie, albo w rzeczywistości nie działa.

Częstym błędem jest nieokreślanie numeru portu podczas wiązania lub łączenia w sieciowej kolejności bajtów ...

RedPandaCurios
źródło
4
To tylko jeden z kilku możliwych warunków, które mogą spowodować błąd.
Remy Lebeau
1
Port może być otwarty, ale ten błąd może nadal występować.
IgorGanapolsky
6

Sprawdź po stronie serwera, czy nasłuchuje na porcie 2080. Najpierw spróbuj to potwierdzić na serwerze, wysyłając telnet do tego portu:

telnet localhost 2080

Jeśli słucha, jest w stanie odpowiedzieć.

Adil
źródło
3

1.Sprawdź stan serwera.

2.Sprawdź stan portu.

Na przykład 3306 netstat -nupl|grep 3306.

3.Sprawdź swoje zapory. Na przykład dodaj 3306

vim /etc/sysconfig/iptables
# add
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
Jack Sun
źródło
netstat -a pomógł
Philip
1

Chociaż nie wydaje się, aby tak było w Twojej sytuacji, czasami błąd odmowy połączenia może również wskazywać, że w Twojej sieci występuje konflikt adresów IP. Możesz wyszukać możliwe konflikty IP, uruchamiając:

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

i

arping <ipaddress>

To pytanie AskUbuntu zawiera również więcej informacji.

Migawka
źródło
0

Z punktu widzenia zapory Checkpoint, jeśli faktycznie wybierzesz opcję Odrzuć jako działanie, zobaczysz komunikat z zapory ogniowej, ujawniając w ten sposób potencjalnemu atakującemu obecność zapory przed serwerem. Zapora po cichu porzuca wszystkie połączenia, które nie są zgodne z zasadami. Odmowa połączenia prawie zawsze pochodzi z serwera

Julio Nalundasan
źródło
0

Ten sam problem występuje z komputerem w pracy. Problem polega na tym, że kiedy wpisujesz localhost, idzie on na adres proxy, a nie na adres lokalny, powinieneś go ominąć, wykonaj następujące kroki

Chrome => Ustawienia => Zmień ustawienia proxy => Ustawienia LAN => zaznacz Omiń serwer proxy dla adresów lokalnych.

İbrahim Özbölük
źródło
0

W Ubuntu spróbuj sudo ufw allow <port_number> zezwolić zaporze ogniowej na dostęp zarówno do serwera, jak i bazy danych.

rajeeva9
źródło
0

Spróbuj przekazać parametr portu „-p”:

sudo iperf -c 127.0.0.1 -p 443
Wellington, 1993
źródło
0

W moim przypadku dzieje się tak, gdy strona jest zablokowana w moim kraju i nie używam VPN. Na przykład, gdy próbuję uzyskać dostęp do vimeo.com z Indonezji, która jest zablokowana.

Aminah Nuraini
źródło
-1

Miałem tę samą wiadomość z zupełnie inną przyczyną: wsock32.dllnie znaleziono. ::socket(PF_INET, SOCK_STREAM, 0);Wezwanie przechowywane zwrócenie INVALID_SOCKETale powodem było to, że winsock dll nie został załadowany.

W końcu uruchomiłem monitor procesów Sysinternals i zauważyłem, że szukał biblioteki dll „wszędzie”, ale jej nie znalazłem.

Ciche porażki są świetne!

xtofl
źródło
1
INVALID_SOCKET nie ma nic wspólnego z „odmową połączenia”. „Ciche błędy” mogą wystąpić tylko wtedy, gdy w kodzie brakuje wymaganej obsługi błędów.
Markiz Lorne
1
masz na myśli, że powinienem był sprawdzić, czy dll został załadowany? Prawdopodobnie masz rację.
xtofl