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?


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.


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.


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óć.


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 ...


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ć.


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

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.


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


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.


0

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



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.


-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!


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.