ターゲット マシンが積極的に接続を拒否するため、接続を確立できなくなります。
P粉268654873
P粉268654873 2023-08-20 12:40:57
0
1
445
<p>Web サービスに対して HttpWebRequest を実行すると、次のエラーが発生することがあります。以下にコードもコピーしました。 </p>
<pre>System.Net.WebException: リモート サーバーに接続できません ---> System.Net.Sockets.SocketException: ターゲット コンピューターが 127.0.0.1:80 を積極的に拒否したため、接続を確立できませんでした System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress ソケットアドレス) で System.Net.Sockets.Socket.InternalConnect(エンドポイントリモートEP)で System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure、Socket s4、Socket s6、Socket&ソケット、IPAddress&アドレス、ConnectSocketState状態、IAsyncResult asyncResult、Int32タイムアウト、Exception&例外) --- 内部例外スタック トレースの終了 --- System.Net.HttpWebRequest.GetRequestStream() で </pre>
<pre class="brush:php;toolbar:false;">ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy(); HttpWebRequest リクエスト = (HttpWebRequest)WebRequest.Create(url); request.PreAuthenticate = true; request.Credentials = networkCredential(sla); request.Method = WebRequestMethods.Http.Post; request.ContentType = "アプリケーション/x-www-form-urlencoded"; request.Timeout = v_Timeout * 1000; if (url.IndexOf("asmx") > 0 && parStartIndex > 0) { AppHelper.Logger.Append("#############" sla.ServiceName); using (StreamWriter reqWriter = new StreamWriter(request.GetRequestStream())) { その間(真) { int Index01 = parList.Length; int Index02 = parList.IndexOf("="); if (parList.IndexOf("&") > 0) Index01 = parList.IndexOf("&"); 文字列parName = parList.Substring(0,index02); 文字列parValue = parList.Substring(index02 1、index01 -index02 - 1); reqWriter.Write("{0}={1}", HttpUtility.UrlEncode(parName), HttpUtility.UrlEncode(parValue)); if (index01 == parList.Length) 壊す; reqWriter.Write("&"); parList = parList.Substring(index01 1); } } } それ以外 { request.ContentLength = 0; } 応答 = (HttpWebResponse)request.GetResponse();</pre> <p><br /></p>
P粉268654873
P粉268654873

全員に返信(1)
P粉852114752

これが常に発生する場合は、実際にはマシンは存在するが、指定されたポートでリッスンしているサービスがないか、ファイアウォールがブロックしていることを意味します。

これが時々発生し (「時々」という言葉を使いましたが)、再試行が成功する場合は、サーバーの「バックログ」がいっぱいである可能性が高くなります。

リッスンソケットで受け入れられるのを待っている間、バックログに置かれます。このバックログは有限で非常に短いため、値が 1、2、または 3 になることも珍しくありません。そのため、オペレーティング システムは、リクエストをキューに入れて使用を「受け入れる」ことができない可能性があります。

バックログは listen 関数のパラメータです。この点に関しては、C# であっても、すべての言語とプラットフォームが基本的に同じ API を持っています。サーバーを制御する場合、このパラメータは通常構成可能であり、構成ファイルまたはレジストリから読み取られる場合があります。サーバーを構成する方法を学びます。

サーバーを作成した場合は、ソケットの受け入れで重い処理が行われる可能性があります。これを別のワーカー スレッドに移動して、受け入れが常に接続を受信できるようにする方がよいでしょう。クライアント側でのキューイングと逐次処理を軽減するために、さまざまなアーキテクチャ オプションを検討できます。

関係なく、サーバーのバックログを増やすことができるかどうかに関係なく、クライアント コードではこれに対処するために retryロジックが必要になります。バックログが長く、その時点でもサーバーは他のポートに対する多くのリクエストを受信する可能性があります。

NAT ルーターでマップされたポートが不足すると、まれにこのエラーが発生する可能性があります。ただし、ルーターは容量が不足する前に同じ宛先アドレス/ポートに対して 64K の同時接続を確立できるため、これはあまりにも可能性が低いと思います。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!