0

次の形式で UDP パケットを送信する必要があります。

[1 オクテット][2 オクテット][3 オクテット][4 オクテット][5 ショート]

例えば:

77.125.65.201:27015

16 進数:

4D 7D 41 C9 69 87

これは私がwiresharkでキャプチャしたものです:

ここに画像の説明を入力

なぜ 2 余分な OCTET [00, 00] なのですか?

そして、これが私がフォーマットする方法です:

byte[] responseHeader = { (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, 0x66, (byte)0x0A };
byte[] testIP = getByteIp("77.125.65.201:27015");
byte[] response = new byte[responseHeader.length + testIP.length];
System.arraycopy(responseHeader, 0, response, 0, responseHeader.length);
System.arraycopy(testIP, 0, response, responseHeader.length, testIP.length);

private byte[] getByteIp(String fullData){
    String[] data = fullData.split(":");
    byte[] returnArray = new byte[8];

    byte[] ip = new byte[4];
    try {
        ip = InetAddress.getByName(data[0]).getAddress();
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    byte[] port = new byte[2];
    port = ByteBuffer.allocate(4).putInt(Integer.parseInt(data[1])).array();

    System.arraycopy(ip, 0, returnArray, 0, ip.length);
    System.arraycopy(port, 0, returnArray, ip.length, port.length);

    return returnArray;
}
4

1 に答える 1

0

問題は、ポート番号が 2 バイトの値であるのに、4 バイトの値で処理していることです。よく見ると、6 バイトではなく 8 バイトであり、それらのゼロの後に 2 つの「重要な」バイトが表示されていることがわかります。

とにかく、次のコードはあなたがやろうとしていることをするはずです。

byte[] port = ByteBuffer.allocate(2).putShort(
        (short) Integer.parseInt(data[1])).array();
于 2013-04-28T09:12:11.533 に答える