2012-07-02 2 views
1

좋아, C#을 사용하여 UDP 트래커에 연결하려고합니다.하지만 응답을 얻지는 못합니다. 나는 또한 오류가 발생하지 않습니다. 여기 내 코드가있다. UDP 트래커가 응답하지 않습니다.

namespace UDPTester 
{ 
    class MainClass 
    { 
     public static bool messageReceived = false; 
     public static Random Random = new Random(); 
     public static void LOG(string format, params object[] args) 
     { 
      Console.WriteLine (format,args);  
     } 
     public static void Main (string[] args) 
     { 
      LOG ("Creating Packet..."); 
      byte[] packet; 
      using(var stream = new MemoryStream()) 
      { 
       var bc = new MiscUtil.Conversion.BigEndianBitConverter(); 
       using(var br = new MiscUtil.IO.EndianBinaryWriter(bc,stream)) 
       { 
        LOG ("Magic Num: {0}",(Int64)0x41727101980); 
        br.Write (0x41727101980); 
        br.Write((Int32)0); 
        br.Write ((Int32)Random.Next()); 
        packet = stream.ToArray(); 
        LOG ("Packet Size: {0}",packet.Length); 
       } 
      } 
      LOG ("Connecting to tracker..."); 
      var client = new System.Net.Sockets.UdpClient("tracker.openbittorrent.com",80); 
      UdpState s = new UdpState(); 
      s.e = client.Client.RemoteEndPoint; 
      s.u = client; 
      StartReceiving(s); 

      LOG ("Sending Packet..."); 
      client.Send(packet,packet.Length); 
      while(!messageReceived) 
      { 
        Thread.Sleep(1000); 
      } 
      LOG ("Ended"); 

     } 
     public static void StartReceiving(UdpState state) 
     { 
      state.u.BeginReceive(ReceiveCallback,state); 
     } 

     public static void ReceiveCallback(IAsyncResult ar) 
     { 
      UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u; 
      IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e; 

      Byte[] receiveBytes = u.EndReceive(ar, ref e); 
      string receiveString = Encoding.ASCII.GetString(receiveBytes); 

      LOG("Received: {0}", receiveString); 
      messageReceived = true; 
      StartReceiving((UdpState)ar.AsyncState); 
     } 

    } 
    public class UdpState 
    { 
     public UdpClient u; 
     public EndPoint e; 
    } 
} 

나는 정상적인 BinaryWriter를 사용했다, 그러나 그것은 작동하지 않았고, 나는 그것이 bigEndian의에서 그것의 데이터를 원하는 어떤 곳을 읽었다.

이것은 내가 발견 한 UDP 추적기에서 작동하지 않습니다. 왜 내가 응답을 얻지 못하는지 알 수 있습니까? 그들은 프로토콜을 변경하고 아무에게도 말하지 않았을까요? HTTP 추적기는 모두 정상적으로 작동합니다. //tracker.publicbt.com : 80

UDP : //tracker.ccc.de : 80

UDP : //tracker.istole 내가

UDP를 시도했습니다

추적자 .80 :

또한 MonoTorrent를 사용하는 데 관심이 없습니다. (UDP를 사용하는 중에도 UDP가 작동하지 않았습니다.) 패킷이 손실되거나 대상에서 삭제 된 경우 오류가 표시되지 않도록

프로토콜 소스

http://xbtt.sourceforge.net/udp_tracker_protocol.html

http://www.rasterbar.com/products/libtorrent/udp_tracker_protocol.html

답변

1

UDP는 비 연결 프로토콜입니다.

시도의 진단 절차를 다음

  1. 사용 패킷 스니퍼 (Wireshark를 좋은 하나입니다) UDP 패킷이 기계를 떠나는 것을 확인합니다.
  2. 작동하는 BitTorrent 클라이언트를 설치하고 추적기와 통신 할 수 있는지 확인하십시오. 그렇다면 패킷 스니퍼를 사용하여 작동중인 클라이언트가 보내는 패킷과 코드가 생성하는 패킷이 다른지 확인하십시오.

작동하는 클라이언트가 트래커와 통신 할 수 없지만 UDP 트래픽이 시스템을 나가는 경우 UDP 패킷이 방화벽에 의해 삭제 될 수 있습니다. 'traceroute'도구를 사용하여 패킷이 삭제 된 위치를 진단 할 수 있습니다 (방화벽이 항상 traceroute에 의해 생성 된 UDP 패킷을 삭제하고 정상 UDP 트래픽을 삭제하지 않기 때문에 항상 100 % 신뢰할 수있는 것은 아닙니다).

+0

그래서 probubly 방화벽 일은 ... 나는 리눅스와 윈도우가 1024 이하의 포트에서 특별한 허가없이 (리눅스를 사용하여) 듣고있어, 모든 사람들이 호스트하는 바보 같은 짓을한다는 것을 안다. 그 추적기는 80 ... 내 생각에. –

관련 문제