2010-03-11 5 views
0
using System; 
using System.Text; 
using System.IO; 
using System.Net.Sockets; 

namespace ConsoleApp01 
{ 
    class Program 
    { 
     public static void Main(string[] args) 
     { 
       TcpClient client = new TcpClient("python.org",80); 
       NetworkStream ns = client.GetStream(); 
       StreamWriter sw = new StreamWriter(ns); 
       sw.Write("HEAD/HTTP/1.1\r\n" 
         + "User-Agent: Test\r\n" 
         + "Host: www.python.org\r\n" 
         + "Connection: Close\r\n"); 
        sw.Flush(); 

        Console.ReadKey(true); 
     } 
    } 
} 

System.Net.Sockets.SocketException : 대상 컴퓨터가 적극적으로 System.Net.Sockets.TcpClient..ctor 그것을 을 거부했기 때문에 연결을 만들 수 없습니다 ConsoleApp01.Program.Main : line 12하여 TcpClient

왜이 오류 메시지가 나타 납니까?

답변

0

그것은 당신이 'TcpClient'에 대한 잘못된 URL을 가지고 있고, 당신이 '하여 TcpClient'인스턴스의 'Connect'메소드를 호출하지 않는 것처럼 ... 여기 보이는이 MSDN 여기에이 version..see 수정의 ... . 내가 너라면, 나는 정확한 오류를 볼 수 try/catch 절에 이것을 포장 할 것이다 ... 처단 할 수있는 객체를 사용하고 있다면, 너는 using 절에서도 그들을 포장하라!

 
try{ 
    TcpClient client = new TcpClient(); 
    client.Connect("www.python.org",80); 
     .... 
}catch(SocketException sockEx){ 
    /* Handle the socket exception.... */ 
} 
+0

URL은 문제가되지 않습니다. python.org와 www.python.org는 모두 동일한 IP를 사용합니다. –

+0

그리고 두 필드를 생성자에 전달하면 코드를 변경하는 것이 아니라 Connect를 호출하는 것과 같습니다. –

+0

흠 .. 나는 호스트 이름과 포트 번호를 전달한다고 생각한다. 생성자에서 인스턴스화 한 다음 연결하는 것과 동일한 작업을 수행합니다. –

2

게시 한 코드를 시도했습니다. 그것은 잘 작동합니다.

도메인 이름 Python.org (방화벽을 사용 중이거나 프록시 서버를 사용하는 경우 가능) 또는 방화벽이 연결을 차단하고 있거나 요청이 잘못된 컴퓨터로 이동 중일 수 있습니다. .

는 "python.org는"분해되어 있는지 확인하려면 :

열고 cmd를 프롬프트 & 유형 "핑 (ping) 82.94.164.162"를. 응답하면 다시 도달 할 수 있습니다.

그런 다음 ping -a 82.94.164.162를 시도하십시오. 이름이 해석 가능한 것보다 python.org로 해석되면.

또한 Windows 방화벽이나 타사 방화벽이 통신을 차단하고 있는지 확인하십시오.

또한 IP를 통해 연결을 시도 할 수 있습니다. 즉

//TcpClient client = new TcpClient("python.org", 80); 
TcpClient client = new TcpClient("82.94.164.162", 80); 

편집 : python.org 당신을 좋아하지 않는다, 또는 당신이 정말로 python.org을 타격하지 않을

using System; 
using System.IO; 
using System.Net.Sockets; 

namespace ConsoleApp01 
{ 
    class Program 
    { 
     public static void Main(string[] args) 
     { 
      try 
      { 
       //TcpClient client = new TcpClient("python.org", 80); 
       TcpClient client = new TcpClient("82.94.164.162", 80); 
       NetworkStream ns = client.GetStream(); 
       StreamWriter sw = new StreamWriter(ns); 
       sw.Write("HEAD/HTTP/1.1\r\n" 
         + "User-Agent: Test\r\n" 
         + "Host: www.python.org\r\n" 
         + "Connection: Close\r\n"); 
       sw.Flush(); 
      } 
      catch (SocketException ex) 
      { 
       Console.WriteLine(ex); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex); 
      } 
      Console.ReadKey(true); 
     } 
    } 
} 
+0

CSharp는 telnet으로 포트 80에 연결을 시도 할 수도 있습니다. –

0

, tommieb75의 제안에 따라 경찰. 활성 거부는 주소가 양호하고 방화벽 차단이 없지만 원격 서버가 RST (TCP RESET)로 응답했음을 의미합니다. 보통은 포트에서 수신 대기하는 것이 없습니다. 그러나 우리 모두가 알고 있기 때문에 포트 80에서 수신 대기하지 않습니다. 필자는 웹 브라우저가 python.org를 탐색 할 수 없다고 생각합니다.

FWIW, 방화벽은 초기 SYN 패킷을 삼켜 버리고 결코 RST를 생성하지 않습니다. 따라서 클라이언트가 재 시도 할 때 약 15 초 지연 후 시간 초과 오류가 발생하게됩니다.

python.org가 다른 모든 사람과 똑같은 것으로 확인 될 수 있습니다. 그렇지 않으면 DNS가 닫힙니다. 만약 그렇다면, 나는 당신과 웹 사이의 투명한 프록시를 의심합니다 .... 어느 쪽이든, 그 시점에서 StackOverflow 것보다 더 많은 ServerFault 질문입니다.

0

포트 형태로 컴퓨터에 텔넷으로 연결할 수 있습니까? 그렇다면 코드에 문제가있을 수 있습니다. 그렇지 않으면 방화벽을 사용하고있는 것입니다.