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