Estoy porgramando un servidor TFTP (mas sencillo que el FTP), basandome en estas
[URL="http://i.stack.imgur.com/6dTH6.png"]normas de paquetes[/URL]
edit: entiendo porque no genera el enlace jeje
Mi probema es que cuando el paquete RRQ del cliente llega al servidor no puedo saber la longitud original del contenido, ya que, cuando llega el paquete tengo que guardarlo en uno predefinido (new DatagramPacket) en la clase server. A este paquete de la clase server le doi un buffer de 516 bytes (o menor, segun la imagen para paquetes de tipo Data son maximo 516 bytes). Entonces cuando hago un datagrampaquet.getLength en el servidor, me da la longitud del paquete que creé en el server no del cliente.
Código:
public void metodoData() throws IOException{
//bufferde bytes para el datagrampacket
byte[] packet = new byte[516];//modo de trabajo - lo deberia usar en algun momento para restar bytes que no quiero al array de datos
byte binariMode = (byte) "octet".length();//creamos un socket
DatagramSocket datagramSocket = new DatagramSocket(5000);
//mientras reciba
while (true) {
boolean ackRecibidos=true;
int i=0;//creamos un datagrampacket con el byte[] anteriormete definido
DatagramPacket datagramPacket = new DatagramPacket(packet,packet.length);
//recibimos un paquete
datagramSocket.receive(datagramPacket);
System.out.println("servidor: llego un paquete!!:");
//creamos un byte[] de la longitud original del contenido(mentira!!!)
byte[] inData = new byte[datagramPacket.getLength()];
//obtenemos los bytes del paquete. Esto me da los bytes que tienen valor mas los nulos del datagrampacket del servidor
inData = datagramPacket.getData();
System.out.println("el fichero mide "+inData.length);
// comprobamos si es un paquete RRQ
byte code;
code = inData[1];
System.out.println("servidor: codigo "+code);
//si es una peticion de lectura
if (code == RRQ) {
System.out.println("servidor: Es un RRQ!!");
//obtengo el nombre del fichero. Este metodo me lo copie de internet. no funciona del todo bien.
String fileName = this.getFileName(inData, inDataLength);
System.out.println(fileName);
public String getFileName(byte[] inData, ) {
byte[] aux = new byte[inData-7];
for (int i = 0; i < aux.length; i++) {
aux[i] = inData[i + 2];
}
System.out.println("server: el nombre del fichero mire: "+aux.length);
return new String(aux);
}
Ahora, cuando imprimo el nombre del fichero, me imprime nombre+byteNulos.
Entonces pense, de poner un if que leyera el fileName y al primer byte null que encuentre saliera y devolviera el fileName sin byte nulos, pero no encontre una equivalencia para igualar a bytes nulos.
Si no me explique bien, comenten pls.
Todo esto porque no logro extraer el filename del paquete que llega del cliente