J'essaye de m'interfacer avec le pilote de tuner Linux en Java comme il est expliqué ici.ioctl() avec JNI: descripteur de fichier brisé
How to interface with the Linux tun driver
Mais puisque vous ne pouvez pas appeler ioctl() avec java, j'utilise Java Native Interface. Cela fonctionne bien tant que je ne lis pas et n'écris pas dans le même fichier.
Si je le fais, je reçois cette exception, que je traduirais par "Le FileDescriptor est dans un état cassé":
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)
Voici le code 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();
}
}
Voici le code 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 (...)' va sûrement essayer de créer un nouveau fichier. Essayez d'utiliser * un * 'RandomAccessFile' à la place des deux flux de fichiers. – EJP