Malformed packet při jednostranné UDP komunikaci z Javy

Oto Buchta tapik na buchtovi.cz
Čtvrtek Září 3 12:55:42 CEST 2009


Zdravím.
Potýkám se teď s poměrně příšerným problémem a Gůgl mlčí.

Píšu něco jako UDP2HTTP proxy v Javě a běžím to na OpenSuSE 11.0, IBM
serveru x3550.

Mám následující kód (toto je jeho hodne orezana verze, takze doufam,
ze bude fungovat ;-) )
:
public class DatagramReceiverServer {
public static class DatagramReceiverThread extends Thread {

    private DatagramPacket packet;
    private DatagramSocket socket;
    private static int counter = 0;

    public DatagramReceiverThread(DatagramSocket socket,
DatagramPacket packet) {
        super("DatagramReceiverThread"+(counter++));
        this.packet = packet;
        this.socket = socket;
    }

    public void run() {
        try {
            byte[] policko = packet.getData();
            if (policko == null || packet.getLength()==0) {
                //no data
                return;
            }
            byte[] zufan = new byte[packet.getLength()];
            System.arraycopy(policko,0,zufan,0,packet.getLength());
            policko = zufan;
            if (policko.length == 1) {
                //command data
                final byte command = policko[0];
                DatagramReceiverServer.process(command);
            } else {
                //so do something
                processRequest(policko);
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.err.println("IOException received:"+e.getLocalizedMessage());
        }
    }

    private int processRequest(byte[] policko) throws IOException {
        HttpURLConnection conn = (HttpURLConnection) new
URL("http://moje.postove.urlcko").openConnection();
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
        conn.setDoInput(true);
        OutputStream outputStream = conn.getOutputStream();

        outputStream.write(policko);
        outputStream.flush();
        outputStream.close();
        int code = conn.getResponseCode();
        if (code != 200) {
            //ups
        }
        boolean cekej = true;
        if (cekej) {
            byte[] outpole= "Doslo".getBytes();
            DatagramPacket outgoing = new
DatagramPacket(outpole,outpole.length,packet.getSocketAddress());
            outgoing.setSocketAddress(packet.getSocketAddress());
            socket.send(outgoing);
        }
        return code;
    }
}
    static boolean listening = true;

    public static void process(byte code) {
        listening = false;
    }

    public static void main(String[] args) throws IOException {
        int port = 9999;
        String host="localhost";
        DatagramSocket datagramSocket = new
DatagramSocket(port,InetAddress.getByName(host));
            datagramSocket.disconnect();

            while (listening) {
                byte[] buf = new byte[1024];
                DatagramPacket packet = new DatagramPacket(buf, buf.length);
                datagramSocket.receive(packet);
                new DatagramReceiverThread(datagramSocket, packet).start();
            }

    }
}

Toto pekne funguje, dostavam UDP pakety = preposilam po HTTP a kdyz
dostanuy zpatky dvoustovku, tak poslu zpet potvrzovaci paket a slus,
vsichni jsou spokojeni.
Ale az do chvile, kdy promennou cekej prenastavim z true na false,
tedy kdyz nechci nazpet nic posilat.

Aniz bych se o cokoli snazil, system zpet odesila UDP paket, a co je
horsi, je dle WireSharku malformed a navic je prazdny. Nemate nekdo
pro to vysvetleni?

Dik vsem,

tapik



Další informace o konferenci Linux