Я пытаюсь взаимодействовать с драйвером Linux tun на Java, как это объясняется здесь.
Как взаимодействовать с драйвером tun для Linux
Но поскольку вы не можете вызывать ioctl() с java, я использую собственный интерфейс Java. Он работает нормально, пока я не читаю и не пишу в один и тот же файл.
Если я это сделаю, я получу это исключение, которое я бы перевел как «FileDescriptor находится в сломанном состоянии»:
java.io.IOException: Le descripteur du fichier est dans un mauvais état
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:326)
at WriterThread.main(WriterThread.java:54)
Вот код Java:
public static void main(String[] arg){
File tunFile = new File("/dev/net/tun");
FileOutputStream outStream;
FileInputStream inStream;
try {
inStream = new FileInputStream(tunFile);
outStream = new FileOutputStream(tunFile);
FileDescriptor fd = inStream.getFD();
//getting the file descriptor
Field f = fd.getClass().getDeclaredField("fd");
f.setAccessible(true);
int descriptor = f.getInt(fd);
//use of Java Native Interface
new TestOuvertureFichier().ioctl(descriptor);
while(true){
System.out.println("reading");
byte[] bytes = new byte[500];
int l = 0;
l = inStream.read(bytes);
//the problem seems to come from here
outStream.write(bytes,0,l);
}
} catch (Exception e) {
e.printStackTrace();
}
}
Вот код C:
JNIEXPORT void JNICALL Java_TestOuvertureFichier_ioctl(JNIEnv *env,jobject obj, jint descriptor){
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TUN;
strncpy(ifr.ifr_name, "tun0", IFNAMSIZ);
int err;
if ( (err = ioctl(descriptor, TUNSETIFF, (void *) &ifr)) == -1 ) {
perror("ioctl TUNSETIFF");exit(1);
}
return;
}
new FileOutputStream(...)
обязательно попытается создать новый файл. Попробуйте использовать одинRandomAccessFile
вместо двух файловых потоков. - person user207421   schedule 01.06.2017