Malformed packet při jednostranné UDP komunikaci z Javy

Richard Holly rho na interway.sk
Čtvrtek Září 3 13:37:40 CEST 2009


Dobry den,
napadli ma 2 veci, ktore by som preveril
1. ak je tento soft v sieti, tak ci nieco dalsie na tom porte 9999 
nekomunikuje (alebo sa nesnazi s vami komunikovat)
2. zistite ako mate nastaveny datagramSocket.getReceiveBufferSize,  
prijamte packet o velkosti 1024, dokumentacia sice hovori ze vacsi 
packet bude orezany, ale nehovori sa nic o tom ci zbytok nezostane v 
receive bufri os.
S pozdravom,


Oto Buchta  wrote / napísal(a):
> 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 Konference