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