Ich versuche, mit dem Linux tun Treiber in Java zu interagieren, wie es hier erklärt wird.ioctl() mit JNI: defekter Dateideskriptor
How to interface with the Linux tun driver
Aber da Sie nicht ioctl() mit Java nennen, kann ich das Java Native Interface verwende. Es funktioniert gut, solange ich nicht in derselben Datei lese und schreibe.
Wenn ich mir diese Ausnahme kann so erhalten, die ich von übersetzen würde "The FileDescriptor ist in einem gebrochenen Zustand":
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)
Hier wird der Java-Code:
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();
}
}
Hier der C-Code:
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;
}
'neue FileOutputStream (...)' wird sicherlich versuchen, eine neue Datei zu erstellen. Versuchen Sie, * one * 'RandomAccessFile' anstelle der beiden Dateiströme zu verwenden. – EJP