2016-04-01 13 views
1

UDP paketinden bilgi almayı deniyorum ancak rastgele çıktı almaya devam ediyorum. Bazen tam olarak ne istediğimi alırım ve diğer zamanlarda yapmam. Ben sunucuya bir UDP paket göndermek için komutu dig @localhost -p 1299 test.mydomain.abc kullanmakUDP paketini ayrıştırdıktan sonra çöp çıkışı

private static void receivePacket() 
{ 
    try { 
     DatagramSocket socket = new DatagramSocket(port); 
     System.out.println("\n Listening..."); 

     while(true) 
     { 
      // Create a packet 
      DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); 

      // Receive packet 
      socket.receive(packet); 
      byte[] data = packet.getData(); 

      // Parse the packet 
      parse(data, packet.getLength()); 

      socket.send(packet); 
     } 

     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
} 

// Parse packets 
private static void parse(byte [] data, int dataLength) 
{ 
    ArrayList<String> name = new ArrayList<String>() 
    String domain = ""; 

    // Get ID 
    int id = ((data[0] & 0xff) << 8) + (data[1] & 0xff); 
    System.out.println("\n ID:\t\t" + id); 

    // Get domain name and number of bits for each word in domain 
    for(int i = 0; i < dataLength; i++) 
    { 
     // If the next bit is a letter then we know the current bit is the number of bits 
     if((data[i] <= ' ') || (data[i] > '~')) 
     { 
      try { 
       if((String.format("%c", data[i+1]).matches("^[a-zA-Z]$"))) 
       { 
        int dSize = Integer.parseInt(String.format("%d", data[i])); 
        name.add(Integer.toString(dSize)); 
       } 

      } catch (Exception e) { 
       //e.printStackTrace(); 
      } 
     } 
     else 
     { 
      // If current bit is letter add to ArrayList 
      try { 
       if((String.format("%c", data[i]).matches("^[a-zA-Z]$"))) 
       { 
        name.add(String.format("%c", data[i])); 
        domain += String.format("%c", data[i]); 
       } 

      } catch (Exception e) { 
       //e.printStackTrace(); 
      } 
     } 
    } 

    System.out.println(" Domain:\t" + domain); 
    System.out.print(" Name:\t\t"); 
    name.add("0"); 

    for(int i = 0; i < name.size(); i++) 
     System.out.print("\'" + name.get(i) + "\' "); 

    System.out.println(); 
} 

:

İşte benim kodudur. İşte altı kez çalıştırdıktan sonra çıkışım. Çıktı, her zaman aşağıdaki (ID değişir) olmalıdır: Eğer çalışma # başlayarak burada gördüğümüz gibi

ID:   64666 
Domain:  testmydomainabc 
Name:   '4' 't' 'e' 's' 't' '8' 'm' 'y' 'd' 'o' 'm' 'a' 'i' 'n' '3' 'a' 'b' 'c' '0' 

Ancak, öyle değil mi 4: enter image description here

'Tamamen rastgele ve ben don nedenini anlamak. Bunu Java ve Windows 10'da kodluyorum. Herhangi bir yardım takdir edilecektir, teşekkür ederim!

Ham Veriler:

Başarılı deneme: Başarısız '4' 't' 'e' 's' 't' '8' 'm' 'y' 'd' 'o' 'm' 'a' 'i' 'n' '3' 'a' 'b' 'c' '0'

b7 01 20 00 01 00 00 00 00 00 01 04 t e s t 08 m y d o m a i n 03 a b c 00 00 01 00 01 00 00) 10 00 00 00 00 00 00 00

: '-127' 'f' '4' 't' 'e' 's' 't' '8' 'm' 'y' 'd' 'o' 'm' 'a' 'i' 'n' '3' 'a' 'b' 'c' '0'

81 f 01 20 00 01 00 00 00 00 00 01 04 t e s t 08 m y d o m a i n 03 a b c 00 00 01 00 01 00 00) 10 00 00 00 00 00 00 00

+1

edilecek sorunun ağda veya ayrıştırma algoritmanızda gerçekleşip gerçekleşmediği. (ve tabii ki de soru gövdesine eklemek faydalı olacaktır) – snickers10m

+0

Aradığınız şey bu olduğundan emin değilim, ancak aldığım tüm bitleri ekledim. –

+1

Doğru yolda. Beklenen çıktıyı üreten bir deneme için ham veriyi ve kötü çıktı üreten bir deneme için ham verileri istiyorum. Sonra ikisini karşılaştırabiliriz (ve bulduğumuz problemleri çözmek için ayrıştırma algoritmanızı geliştiririz). – snickers10m

cevap

1

Kişisel döngüden parse başlar, muhtemelen 2'dan başlamalıdır. Aksi kimliği bayt sadece görmek için `packet.getData()` depolanan ham verinin çıktısını Domain ayrıştırma dahil (veya silenty yok sayılır bir özel durum) Bu yararlı olabilir

+0

Teşekkürler, snickers10m aslında bunun üzerine çıkmamı sağladı. Kullandığım "12" yerine 2'den başlayacağım. –