Я пытаюсь разработать приложение веб-фильтра.Я получаю исходящие пакеты, и я хочу отфильтровать их и отправить пакеты, которые не заблокированы пользователем по адресу назначения.У меня проблема с DatagramChannel для отправки пакетов.
Я перепробовал много адресов и портов, но получаю исключение недоступности порта.
private Thread mThread;
public static ParcelFileDescriptor mInterface;
Builder builder;
public static boolean isRunning = false;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Start a new session by creating a new thread.
isRunning = true;
mThread = new Thread(new Runnable() {
@Override
public void run() {
try {
// Configure
builder = new Builder();
mInterface = builder.setSession("MyVPNService")
.addAddress("10.0.0.1", 32)
.addRoute("0.0.0.0", 0)
.establish(); //Connection established
System.out.println("Started vpn");
System.out.println(Inet4Address.getLocalHost().getHostAddress());
//Incoming packets
FileInputStream in = new FileInputStream(
mInterface.getFileDescriptor());
//Outgoing Packets
FileOutputStream out = new FileOutputStream(
mInterface.getFileDescriptor());
System.out.println(mInterface.getFileDescriptor().hashCode());
DatagramChannel tunnel = DatagramChannel.open();
DatagramSocket newSocket = new DatagramSocket();
tunnel.connect(new InetSocketAddress(80));
protect(newSocket);
while (isRunning) {
//Incoming packets
ByteBuffer buffer = ByteBuffer.allocate(Short.MAX_VALUE);
byte[] packet = buffer.array();
int length = in.read(packet);
if (length > 0){
IpV4Packet ıpV4Packet = IpV4Packet.newPacket(packet, 0, packet.length);
if (ıpV4Packet.getHeader() != null){
//Caught a packet
System.out.printf("New Packet IPv4: Protocol: %s \t From: %s \t To: %s",
ıpV4Packet.getHeader().getProtocol().toString(),
ıpV4Packet.getHeader().getSrcAddr().toString(),
ıpV4Packet.getHeader().getDstAddr().toString());
}else{
IpV6Packet ipV6packet = IpV6Packet.newPacket(packet, 0, packet.length);
if (ipV6packet.getHeader() != null){
System.out.printf("New Packet IPv6: Protocol: %s \t From: %s \t To: %s",
ipV6packet.getHeader().getProtocol().toString(),
ipV6packet.getHeader().getSrcAddr().toString(),
ipV6packet.getHeader().getDstAddr().toString());
}
}
buffer.limit(length);
newSocket.send(new DatagramPacket(packet,packet.length)); //Problem is here
buffer.clear();
}
System.out.println();
Thread.sleep(100);
}
} catch (Exception e) {
e.printStackTrace();
isRunning = false;
} finally {
try {
if (mInterface != null) {
mInterface.close();
mInterface = null;
}
} catch (Exception e) {
}
}
}
}, "MyVpnRunnable");
//start the service
mThread.start();
return START_STICKY;
}
Как я могу отправить обнаруженные пакетык месту назначения?