Apa yang bisa menjadi alasan koneksi menolak kesalahan?

114

Saya mencoba menulis program server di C, menggunakan klien lain, saya mendapatkan kesalahan ini ketika saya mencoba menyambung melalui port 2080 misalnya.

connection refused

Apa yang menjadi penyebab kesalahan ini?

Zenet
sumber
Saya baru saja mendapat kesalahan ini, karena kesalahan server tempat saya meng-host situs web saya. Server masih bisa dieditping , downforeveryoneorjustme.com menunjukkan bahwa bukan hanya saya dan saya juga masih bisa mengaksesnya melalui FTP. Setelah beberapa menit, kesalahan teratasi.
Martin Thoma
2
@moose: ping tidak memberi tahu Anda apakah port tertentu dapat diakses dan didengarkan, hanya apakah alamat IP dapat dijangkau. Tetapi connect()tergantung pada IP dan port tertentu yang siap digunakan.
Remy Lebeau
Kesalahan Server memiliki pertanyaan kanonik tentang Sambungan Ditolak .
Raedwald
Berikut penjelasan singkat tentang Connection Refused .
rbinnun
Saya mendapat koneksi yang ditolak di Ubuntu karena saya mencoba menerima koneksi di 'localhost' tetapi 'localhost' tidak dikonfigurasi dengan benar di mesin saya. Mengubah 'localhost' menjadi '' (Python) memecahkan masalah.
pengguna1097111

Jawaban:

93

Mungkin ada banyak alasan, tetapi yang paling umum adalah:

  1. Port tidak terbuka di mesin tujuan.

  2. Porta terbuka di mesin tujuan, tetapi simpanan koneksi yang tertunda sudah penuh.

  3. Firewall antara klien dan server memblokir akses (juga periksa firewall lokal).

Setelah memeriksa firewall dan port terbuka, gunakan telnet untuk menyambung ke ip / port untuk menguji konektivitas. Ini menghilangkan potensi masalah dari aplikasi Anda.

a'r
sumber
7
Firewall biasanya memberikan kesalahan waktu tunggu, karena paket connect (SYN) akan dibuang begitu saja. Koneksi ditolak karena server telah menerima dan menolak paket SYN.
RedPandaCurios
15
Tidak selalu, karena firewall dapat dikonfigurasi untuk menolak daripada menjatuhkan paket.
aēr
hubungkan () dengan alamat IP Server yang salah dan konfigurasi nomor port di program klien juga akan menghasilkan errno 111.
smRaj
Selain itu: ketika Anda perlu mengakses https, tetapi Anda telah menentukan http: // ... kesalahan ini juga dapat terjadi.
Fico
4
@ a'r Bagaimana Anda mengetahui status backlog?
Naveen Verma
75

Kesalahan berarti OS dari soket pendengar mengenali permintaan koneksi masuk tetapi memilih untuk menolaknya dengan sengaja.

Dengan asumsi firewall perantara tidak menghalangi, hanya ada dua alasan (yang saya ketahui) bagi OS untuk menolak permintaan koneksi masuk. Salah satu alasannya telah disebutkan beberapa kali - port pendengar yang dihubungkan tidak terbuka.

Ada alasan lain yang belum disebutkan - port pendengaran sebenarnya terbuka dan aktif digunakan, tetapi simpanan permintaan koneksi masuk antriannya telah mencapai maksimum sehingga tidak ada ruang yang tersedia untuk permintaan koneksi masuk untuk mengantri pada saat itu. saat. Kode server belum memanggil accept () cukup sering untuk menyelesaikan pembersihan slot yang tersedia untuk item antrian baru.

Tunggu beberapa saat dan coba koneksi lagi. Sayangnya, tidak ada cara untuk membedakan antara "port tidak terbuka sama sekali" dan "port terbuka tetapi sekarang terlalu sibuk". Keduanya menggunakan kode kesalahan umum yang sama.

Remy Lebeau
sumber
4
Ada juga kasus satu sisi seperti yang dijelaskan di sini: softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/… . pada dasarnya jika Anda sedang menguji stres aplikasi klien / server Anda, dan Anda menggunakan pendekatan naif seperti yang disebutkan dalam 3.6, kesalahan "koneksi ditolak" dapat terjadi, dan itu berbeda dari dua kasus di atas.
ernesto
Ini perlu diberi suara positif. Setelah penyebab yang jelas (tidak ada yang mendengarkan) telah diselesaikan, maka ini sebenarnya penjelasan yang paling mungkin, dan memperbaikinya bisa menjadi masalah yang kompleks.
Graham Nicholls
jika simpanan permintaan masuk antrian telah mencapai maksimum, bagaimana kita bisa memperbaikinya?
ACarter
adalah backlog antri oleh IP? Saya mencoba menggunakan telnet email-smtp.eu-west-1.amazonaws.com 25 dari instans EC2 dan mesin lokal saya, panggilan telnet instans EC2 memberikan koneksi ditolak sementara dari mesin lokal saya berfungsi
dresh
"tidak ada yang mendengarkan" mungkin disebabkan oleh mesin sedang aktif tetapi server (perangkat lunak) misalnya Apache tidak berjalan.
ttulinsky
24

Jika Anda mencoba membuka koneksi TCP ke host lain dan melihat kesalahan "Sambungan ditolak", itu artinya

  1. Anda mengirim paket TCP SYN ke host lain.
  2. Kemudian Anda menerima paket TCP RST sebagai balasan.

RST sedikit pada paket TCP yang menunjukkan bahwa koneksi harus diatur ulang. Biasanya ini berarti bahwa host lain telah menerima upaya koneksi Anda dan secara aktif menolak koneksi TCP Anda, tetapi terkadang firewall yang mengintervensi dapat memblokir paket TCP SYN Anda dan mengirim TCP RST kembali kepada Anda.

Lihat https://tools.ietf.org/html/rfc793 halaman 69:

SYN-RECEIVED STATE

Jika bit RST disetel

Jika koneksi ini dimulai dengan pasif OPEN (yaitu, berasal dari status LISTEN), kembalikan koneksi ini ke status LISTEN dan kembali. Pengguna tidak perlu diinformasikan. Jika koneksi ini dimulai dengan OPEN aktif (yaitu, berasal dari status SYN-SENT) maka koneksi ditolak, memberi sinyal pengguna "koneksi ditolak". Dalam kedua kasus tersebut, semua segmen pada antrian transmisi ulang harus dihapus. Dan dalam kasus OPEN aktif, masukkan status TUTUP dan hapus TCB, dan kembali.

James Brock
sumber
11

Sambungan ditolak berarti port yang Anda coba sambungkan tidak benar-benar terbuka.

Jadi, Anda bisa menghubungkan ke alamat IP yang salah, atau ke port yang salah, atau server mendengarkan di port yang salah, atau tidak benar-benar berjalan.

Kesalahan umum tidak menentukan nomor port saat mengikat atau menghubungkan dalam urutan byte jaringan ...

RedPandaCurios
sumber
4
Ini hanyalah salah satu dari beberapa kemungkinan kondisi yang dapat menyebabkan kesalahan.
Remy Lebeau
1
Port mungkin terbuka, tetapi kesalahan ini masih bisa terjadi.
IgorGanapolsky
6

Periksa di sisi server bahwa ia sedang mendengarkan di port 2080. Pertama coba konfirmasikan di mesin server dengan menerbitkan telnet ke port itu:

telnet localhost 2080

Jika mendengarkan, ia mampu merespons.

Adil
sumber
3

1. Periksa status server Anda.

2. Periksa status port.

Misalnya 3306 netstat -nupl|grep 3306.

3. Periksa firewall Anda. Misalnya tambahkan 3306

vim /etc/sysconfig/iptables
# add
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
Jack Sun.
sumber
netstat -a membantu
Philip
1

Meskipun tampaknya tidak demikian untuk situasi Anda, terkadang kesalahan koneksi menolak juga dapat menunjukkan bahwa ada konflik alamat ip di jaringan Anda. Anda dapat mencari kemungkinan konflik ip dengan menjalankan:

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

dan

arping <ipaddress>

Pertanyaan AskUbuntu ini juga memiliki beberapa informasi lebih lanjut.

Foto
sumber
0

Dari sudut pandang firewall Checkpoint, Anda akan melihat pesan dari firewall jika Anda benar-benar memilih Tolak sebagai Tindakan, sehingga penyerang dapat mengekspos keberadaan firewall di depan server. Firewall akan menghentikan semua koneksi yang tidak sesuai dengan kebijakan secara diam-diam. Sambungan ditolak hampir selalu berasal dari server

Julio Nalundasan
sumber
0

Saya mendapatkan masalah yang sama dengan komputer kerja saya. Masalahnya adalah ketika Anda memasukkan localhost, itu masuk ke alamat proxy bukan alamat lokal Anda harus melewati itu ikuti langkah-langkah ini

Chrome => Pengaturan => Ubah pengaturan proxy => Pengaturan LAN => centang Bypass server proxy untuk alamat lokal.

İbrahim Özbölük
sumber
0

Di Ubuntu, Coba sudo ufw allow <port_number> izinkan akses firewall ke server dan db Anda.

rajeeva9
sumber
0

Coba berikan parameter port "-p":

sudo iperf -c 127.0.0.1 -p 443
Wellington, 1993
sumber
0

Dalam kasus saya, ini terjadi ketika situs diblokir di negara saya dan saya tidak menggunakan VPN. Misalnya ketika saya mencoba mengakses vimeo.com dari Indonesia yang diblokir.

Aminah Nuraini
sumber
-1

Saya memiliki pesan yang sama dengan penyebab yang sama sekali berbeda: wsock32.dlltidak ditemukan. The ::socket(PF_INET, SOCK_STREAM, 0);panggilan terus kembali sebuah INVALID_SOCKETtapi alasannya adalah bahwa winsock dll tidak dimuat.

Pada akhirnya saya meluncurkan monitor proses Sysinternals dan memperhatikan bahwa ia mencari dll 'di mana-mana' tetapi tidak menemukannya.

Kegagalan diam-diam itu bagus!

xtofl
sumber
1
INVALID_SOCKET tidak ada hubungannya dengan 'koneksi ditolak'. 'Kegagalan diam-diam' hanya dapat terjadi jika kode Anda hilang, diperlukan penanganan kesalahan.
Marquis dari Lorne
1
maksud Anda saya harus memeriksa bahwa dll itu dimuat? kamu mungkin benar.
xtofl