대상 시스템이 연결을 적극적으로 거부하여 연결을 설정할 수 없게 됩니다.
P粉268654873
P粉268654873 2023-08-20 12:40:57
0
1
501
<p>웹 서비스에 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(EndPoint 원격EP)에서 System.Net.ServicePoint.ConnectSocketInternal(부울 connectFailure, 소켓 s4, 소켓 s6, 소켓 및 소켓, IPAddress 및 주소, ConnectSocketState 상태, IAsyncResult asyncResult, Int32 시간 초과, 예외 및 예외) --- 내부 예외 스택 추적 끝 --- 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 = "application/x-www-form-urlencoded"; request.Timeout = v_Timeout * 1000; if (url.IndexOf("asmx") > 0 && parStartIndex > 0) { AppHelper.Logger.Append("#############" + sla.ServiceName); (StreamWriter reqWriter = new StreamWriter(request.GetRequestStream())) 사용 { 동안(사실) { int index01 = parList.Length; int index02 = parList.IndexOf("="); if (parList.IndexOf("&") > 0) index01 = parList.IndexOf("&"); string parName = parList.Substring(0, index02); string 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); } } } 또 다른 { 요청.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 동시 연결을 설정할 수 있으므로 이는 가능성이 거의 없다고 생각합니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!