forked from I2P_Developers/i2p.i2p
Add v3 datagram and raw to sink
This commit is contained in:
@ -1,10 +1,13 @@
|
|||||||
package net.i2p.sam.client;
|
package net.i2p.sam.client;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.net.DatagramPacket;
|
||||||
|
import java.net.DatagramSocket;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.security.GeneralSecurityException;
|
import java.security.GeneralSecurityException;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -51,6 +54,7 @@ public class SAMStreamSink {
|
|||||||
" modes: stream: 0; datagram: 1; v1datagram: 2; raw: 3; v1raw: 4\n" +
|
" modes: stream: 0; datagram: 1; v1datagram: 2; raw: 3; v1raw: 4\n" +
|
||||||
" -s: use SSL\n" +
|
" -s: use SSL\n" +
|
||||||
" multiple -o session options are allowed";
|
" multiple -o session options are allowed";
|
||||||
|
private static final int V3DGPORT=9999;
|
||||||
|
|
||||||
public static void main(String args[]) {
|
public static void main(String args[]) {
|
||||||
Getopt g = new Getopt("SAM", args, "sb:m:p:u:v:w:");
|
Getopt g = new Getopt("SAM", args, "sb:m:p:u:v:w:");
|
||||||
@ -176,6 +180,9 @@ public class SAMStreamSink {
|
|||||||
throw new IOException("2nd handshake failed");
|
throw new IOException("2nd handshake failed");
|
||||||
if (_log.shouldLog(Log.DEBUG))
|
if (_log.shouldLog(Log.DEBUG))
|
||||||
_log.debug("Handshake2 complete.");
|
_log.debug("Handshake2 complete.");
|
||||||
|
} else if (_isV3 && (mode == DG || mode == RAW)) {
|
||||||
|
// set up a listening DatagramSocket
|
||||||
|
(new DGRcvr(mode)).start();
|
||||||
}
|
}
|
||||||
writeDest(ourDest);
|
writeDest(ourDest);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@ -183,6 +190,52 @@ public class SAMStreamSink {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class DGRcvr extends I2PAppThread {
|
||||||
|
private final int _mode;
|
||||||
|
|
||||||
|
public DGRcvr(int mode) { _mode = mode; }
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
byte[] buf = new byte[32768];
|
||||||
|
try {
|
||||||
|
Sink sink = new Sink("FAKE", "FAKEFROM");
|
||||||
|
DatagramSocket dg = new DatagramSocket(V3DGPORT);
|
||||||
|
while (true) {
|
||||||
|
DatagramPacket p = new DatagramPacket(buf, 32768);
|
||||||
|
dg.receive(p);
|
||||||
|
int len = p.getLength();
|
||||||
|
int off = p.getOffset();
|
||||||
|
byte[] data = p.getData();
|
||||||
|
_log.info("Got datagram length " + len);
|
||||||
|
if (_mode == DG) {
|
||||||
|
ByteArrayInputStream bais = new ByteArrayInputStream(data, off, len);
|
||||||
|
String line = DataHelper.readLine(bais);
|
||||||
|
if (line == null) {
|
||||||
|
_log.error("DGRcvr no header line");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (line.length() < 516) {
|
||||||
|
_log.error("DGRcvr line too short: \"" + line + '\n');
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String[] parts = line.split(" ");
|
||||||
|
String dest = parts[0];
|
||||||
|
_log.info("DG is from " + dest);
|
||||||
|
for (int i = 1; i < parts.length; i++) {
|
||||||
|
_log.info("Parameter: " + parts[i]);
|
||||||
|
}
|
||||||
|
int left = bais.available();
|
||||||
|
sink.received(data, off + len - left, left);
|
||||||
|
} else {
|
||||||
|
sink.received(data, off, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
_log.error("DGRcvr", ioe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static class Pinger extends I2PAppThread {
|
private static class Pinger extends I2PAppThread {
|
||||||
private final OutputStream _out;
|
private final OutputStream _out;
|
||||||
|
|
||||||
@ -471,10 +524,14 @@ public class SAMStreamSink {
|
|||||||
String style;
|
String style;
|
||||||
if (mode == STREAM)
|
if (mode == STREAM)
|
||||||
style = "STREAM";
|
style = "STREAM";
|
||||||
else if (mode == DG || mode == V1DG)
|
else if (mode == V1DG)
|
||||||
style = "DATAGRAM";
|
style = "DATAGRAM";
|
||||||
else
|
else if (mode == DG)
|
||||||
|
style = "DATAGRAM PORT=" + V3DGPORT;
|
||||||
|
else if (mode == V1RAW)
|
||||||
style = "RAW";
|
style = "RAW";
|
||||||
|
else
|
||||||
|
style = "RAW PORT=" + V3DGPORT;
|
||||||
String req = "SESSION CREATE STYLE=" + style + " DESTINATION=" + dest + ' ' + _conOptions + ' ' + sopts + '\n';
|
String req = "SESSION CREATE STYLE=" + style + " DESTINATION=" + dest + ' ' + _conOptions + ' ' + sopts + '\n';
|
||||||
samOut.write(req.getBytes());
|
samOut.write(req.getBytes());
|
||||||
samOut.flush();
|
samOut.flush();
|
||||||
@ -501,7 +558,7 @@ public class SAMStreamSink {
|
|||||||
}
|
}
|
||||||
if (_log.shouldInfo())
|
if (_log.shouldInfo())
|
||||||
_log.info(_destFile + " is located at " + destination);
|
_log.info(_destFile + " is located at " + destination);
|
||||||
if (mode != STREAM) {
|
if (mode == V1DG || mode == V1RAW) {
|
||||||
// fake it so the sink starts
|
// fake it so the sink starts
|
||||||
eventHandler.streamConnectedReceived(destination, "FAKE");
|
eventHandler.streamConnectedReceived(destination, "FAKE");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user