107 lines
4.2 KiB
Java
107 lines
4.2 KiB
Java
// compile & run this file against i2p.jar
|
|
|
|
import java.io.*;
|
|
import java.util.*;
|
|
import net.i2p.*;
|
|
import net.i2p.client.*;
|
|
import net.i2p.data.*;
|
|
|
|
public class GuaranteedBug {
|
|
|
|
|
|
public void reproduce() {
|
|
try {
|
|
Destination d1 = null;
|
|
// first client (receiver)
|
|
if (true) { // smaller scope for variables ...
|
|
I2PClient client = I2PClientFactory.createClient();
|
|
ByteArrayOutputStream keyStream =
|
|
new ByteArrayOutputStream(512);
|
|
d1 = client.createDestination(keyStream);
|
|
ByteArrayInputStream in =
|
|
new ByteArrayInputStream(keyStream.toByteArray());
|
|
Properties opts = new Properties();
|
|
opts.setProperty(I2PClient.PROP_RELIABILITY,
|
|
I2PClient.PROP_RELIABILITY_GUARANTEED);
|
|
opts.setProperty(I2PClient.PROP_TCP_HOST, "127.0.0.1");
|
|
opts.setProperty(I2PClient.PROP_TCP_PORT, "7654");
|
|
I2PSession session = client.createSession(in, opts);
|
|
session.connect();
|
|
session.setSessionListener(new PacketCounter());
|
|
}
|
|
// second client (sender)
|
|
I2PClient client = I2PClientFactory.createClient();
|
|
ByteArrayOutputStream keyStream = new ByteArrayOutputStream(512);
|
|
Destination d2 = client.createDestination(keyStream);
|
|
ByteArrayInputStream in =
|
|
new ByteArrayInputStream(keyStream.toByteArray());
|
|
Properties opts = new Properties();
|
|
opts.setProperty(I2PClient.PROP_RELIABILITY,
|
|
I2PClient.PROP_RELIABILITY_GUARANTEED);
|
|
opts.setProperty(I2PClient.PROP_TCP_HOST, "127.0.0.1");
|
|
opts.setProperty(I2PClient.PROP_TCP_PORT, "7654");
|
|
I2PSession session = client.createSession(in, opts);
|
|
session.connect();
|
|
session.setSessionListener(new DummyListener());
|
|
for (int i=0;i<1000; i++) {
|
|
byte[] msg = (""+i).getBytes("ISO-8859-1");
|
|
session.sendMessage(d1,msg);
|
|
System.out.println(">>"+i);
|
|
}
|
|
} catch (IOException ex) {
|
|
ex.printStackTrace();
|
|
} catch (I2PException ex) {
|
|
ex.printStackTrace();
|
|
}
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
new GuaranteedBug().reproduce();
|
|
}
|
|
|
|
// -------------------------------------------------------
|
|
public class DummyListener implements I2PSessionListener {
|
|
public void disconnected(I2PSession session) {
|
|
System.err.println("Disconnected: "+session);
|
|
}
|
|
|
|
public void errorOccurred(I2PSession session, String message,
|
|
Throwable error) {
|
|
System.err.println("Error: "+session+"/"+message);
|
|
error.printStackTrace();
|
|
}
|
|
|
|
public void messageAvailable(I2PSession session, int msgId,
|
|
long size) {
|
|
System.err.println("Message here? "+session);
|
|
}
|
|
|
|
public void reportAbuse(I2PSession session, int severity) {
|
|
System.err.println("Abuse: "+severity+"/"+session);
|
|
}
|
|
}
|
|
|
|
public class PacketCounter extends DummyListener {
|
|
private int lastPacket = -1;
|
|
public void messageAvailable(I2PSession session, int msgId,
|
|
long size) {
|
|
try {
|
|
byte msg[] = session.receiveMessage(msgId);
|
|
String m = new String(msg, "ISO-8859-1");
|
|
int no = Integer.parseInt(m);
|
|
if (no != ++lastPacket) {
|
|
System.out.println("ERROR: <<"+no);
|
|
} else {
|
|
System.out.println("<<"+no);
|
|
}
|
|
} catch (NumberFormatException ex) {
|
|
ex.printStackTrace();
|
|
} catch (I2PException ex) {
|
|
ex.printStackTrace();
|
|
} catch (IOException ex) {
|
|
ex.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
}
|