Mesin sasaran secara aktif menolak sambungan, mengakibatkan ketidakupayaan untuk mewujudkan sambungan.
P粉268654873
2023-08-20 12:40:57
<p>Kadang-kadang apabila saya melaksanakan HttpWebRequest kepada perkhidmatan Web, ralat berikut berlaku. Saya juga telah menyalin kod saya di bawah. </p>
<hr />
<pra>System.Net.WebException: Tidak dapat menyambung ke pelayan jauh ---> System.Net.Sockets.SocketException: Sambungan tidak dapat diwujudkan kerana komputer sasaran secara aktif menolak 127.0.0.1:80
di System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
di System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP)
di System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)
--- Tamat surih tindanan pengecualian dalam ---
di System.Net.HttpWebRequest.GetRequestStream()
</pra>
<hr />
<pre class="brush:php;toolbar:false;">ServicePointManager.CertificatePolicy = TrustAllCertificatePolicy();
Permintaan HttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
request.PreAuthenticate = benar;
request.Credentials = networkCredential(sla);
request.Method = WebRequestMethods.Http.Post;
request.ContentType = "application/x-www-form-urlencoded";
request.Timeout = v_Timeout * 1000;
if (url.IndexOf("asmx") > 0 &&parStartIndex > 0)
{
AppHelper.Logger.Append("##############" + sla.ServiceName);
menggunakan (StreamWriter reqWriter = new StreamWriter(request.GetRequestStream()))
{
sementara (benar)
{
int index01 = parList.Length;
int index02 = parList.IndexOf("=");
if (parList.IndexOf("&") > 0)
index01 = parList.IndexOf("&");
rentetan parName = parList.Substring(0, index02);
rentetan parValue = parList.Substring(index02 + 1, index01 - index02 - 1);
reqWriter.Write("{0}={1}", HttpUtility.UrlEncode(parName), HttpUtility.UrlEncode(parValue));
if (index01 == parList.Length)
pecah;
reqWriter.Write("&");
parList = parList.Substring(index01 + 1);
}
}
}
lain
{
request.ContentLength = 0;
}
respons = (HttpWebResponse)request.GetResponse();</pre>
<p><br /></p>
Jika ini terus berlaku, maka ia sebenarnya bermakna mesin itu wujud, tetapi tiada perkhidmatan mendengar pada port yang ditentukan, atau terdapat tembok api yang menghalang anda.
Jika ini berlaku sekali-sekala - anda menggunakan perkataan "kadang-kadang" - dan percubaan semula berjaya, kemungkinan besar kerana 'backlog' pelayan penuh.
Sementara anda menunggu untuk diterima di soket mendengar, anda akan diletakkan dalam tunggakan. Tunggakan ini adalah terhingga dan sangat pendek - nilai 1, 2 atau 3 adalah perkara biasa - jadi sistem pengendalian mungkin tidak dapat beratur permintaan anda untuk 'menerima' untuk penggunaan.
backlog ialah parameter fungsi
listen
- semua bahasa dan platform pada asasnya mempunyai API yang sama dalam hal ini, malah C#. Jika anda mengawal pelayan, parameter ini biasanya boleh dikonfigurasikan dan boleh dibaca daripada beberapa fail konfigurasi atau pendaftaran. Ketahui cara mengkonfigurasi pelayan anda.Jika anda menulis pelayan, anda mungkin mempunyai pemprosesan yang berat dalam penerimaan soket, yang boleh dialihkan dengan lebih baik ke urutan pekerja yang berasingan, supaya penerimaan anda sentiasa bersedia untuk menerima sambungan. Anda boleh meneroka pelbagai pilihan seni bina untuk mengurangkan beratur dan pemprosesan berurutan di sisi pelanggan.
Apa pun, tidak kira sama ada anda boleh meningkatkan tunggakan pelayan atau tidak, kod klien anda memerlukan cuba semulalogik untuk menangani perkara ini - kerana walaupun dengan tunggakan yang lama, pelayan mungkin masih tersangkut pada masa itu Ramai permintaan untuk pelabuhan lain diterima.
Terdapat kemungkinan yang jarang berlaku bahawa ralat ini akan berlaku jika penghala NAT kehabisan port yang dipetakan. Saya fikir ini terlalu tidak mungkin, kerana penghala boleh mewujudkan sambungan serentak 64K ke alamat/port destinasi yang sama sebelum kehabisan kapasiti.