2009-12-05 5 views
4

HTTP 헤더를 스니핑하는 스크립트를 작성하려고했습니다. 지금까지 포트 80에 연결된 소켓을 가지고 있고 패킷이 수신 된 것으로 보이지만 문자열 형식으로 가져올 수는 없습니다. 모든 출력은 지속적으로 "E"입니다. 이전에 바이트를 16 진수로 변경했는데 일부 데이터가 들어오는 것처럼 보였지만 현재 코드는 바이트를 문자열로 변경할 수 없습니다. 적절한 문자열을 제공하는 바이트를 디코딩하는 다른 방법이 있습니까?C# 패킷 데이터 받기

byte[] input = BitConverter.GetBytes(1); 
byte[] buffer = new byte[4096]; 
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP); 
s.Bind(new IPEndPoint(IPAddress.Parse(strIP), 80)); 
s.IOControl(IOControlCode.ReceiveAll, input, null); 
int bytes; 
bytes = s.Receive(buffer); 
while (bytes > 0) 
{ 
    log(System.Text.Encoding.ASCII.GetString(buffer, 0, bytes)); 
    bytes = s.Receive(buffer); 
} 

답변

6

당신이 원시 소켓을 사용하여 데이터를 도청 할 때, 인터넷 프로토콜 (IP) 패킷을 수신하고 있습니다. 각 IP 패킷은 IP header으로 시작됩니다. 이 헤더는 일반적으로 20 바이트 길이이지만 그보다 길 수 있습니다. IP 헤더 다음에 전송 레이어의 헤더 (예 : Transmission Control Protocol (TCP) 헤더 또는 User Datagram Protocol (UDP) 헤더)가 있습니다. 이 헤더 뒤에는 사용자가 찾고자하는 데이터 (예 : HTTP)가옵니다. 따라서 데이터를 파싱 할 때 먼저 IP 헤더와 전송 계층 헤더를 건너 뛸 필요가 있습니다.

+0

'어떻게'재미 있었 을까 ... – C4u

5

당신이 C# 네트워크 스니퍼, here의 소스 코드를 체크 아웃 할 수 있습니다.

+0

감사합니다. 이걸 살펴 봤는데 문자열 대신 데이터를 바이트 배열로 반환한다고 생각합니다. 헤더의 데이터가 문자열로 변환하는 데 문제가 있습니까? – James

5

왜 원시 소켓을 사용하고 IOControl을 변경하는 이유는 무엇입니까? Vista에서 코드를 실행하려고 시도했지만 관리자가 아니더라도 작동하지 않습니다. 대신에 TcpClient와 같은 더 높은 수준의 추상화를 사용할 수 있습니까?

두 번째로 응답을 받기 전에 요청을 보내야합니다. 보낼 수있는 가장 간단한 요청은 "GET/\ n"입니다. 여기서 \ n은 새 행의 문자입니다.

여기 당신이 사용할 수있는 몇 가지 코드 (쓰기 방법도 반환 값을 확인해야하지만이 생략됩니다) :

 using (TcpClient tcpClient = new TcpClient(strIP, 80)) 
     { 
      using (Stream s = tcpClient.GetStream()) 
      { 
       byte[] bytesToSend = Encoding.ASCII.GetBytes("GET /\n"); 
       s.Write(bytesToSend, 0, bytesToSend.Length); 
       int bytes; 
       byte[] buffer = new byte[4096]; 
       do 
       { 
        bytes = s.Read(buffer, 0, buffer.Length); 
        Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytes)); 
       } while (bytes > 0); 
      } 
     }