Java - Ayuda, send() no envía el datagrama

 
Vista:

Ayuda, send() no envía el datagrama

Publicado por Cesar Zero (1 intervención) el 04/08/2018 20:03:35
Hola todos, espero que puedan ayudarme con esta consulta.
Estoy haciendo un servidor DHCP con DatagramSocket y al enviar el paquete este al parecer no es enviado, la computadora de destino no lo recibe (wireshark no me muestra el paquete que envio, una DHCP offer), y tampoco lo puedo ver en wireshark en la misma maquina.

El programa si recibe los mensajes de DHCP y obtienen todos los datos del paquete pero al generar la respuesta y enviar falla (no marca error alguno).

Los equipo están conectado por un swicth de 5 puertos en donde solo estan los 2 (servidor, cliente).

Les dejo la sección de codigo que se encarga del envió del paquete

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
try {
 
    socket = new DatagramSocket(listenPort);  // listenPort=67
 
    byte[] buffer = new byte[MAX_BUFFER_SIZE];
    int length = 548;
    DatagramPacket paquete = new DatagramPacket(buffer, length);
    System.out.println("Listening on port " + listenPort + "...");
 
    //server is always listening
    boolean listening = true;
    while (listening) {
        socket.receive(paquete); //throws i/o exception
 
        System.out.println("Connection established from " + paquete.getAddress());
        .....
        .....
        .....
 
        if(equipoN!=0){
        if(buffer[1]==1){//paquete de envio
            System.out.println("Paquete de envio");
            for(l=240; l<548; l++){ // recorre el buffer
                // System.out.println(i);
                if(buffer[l]<122 &&buffer[l]>1){// valor de posible opcion
 
                    System.out.println("Opcion N: "+buffer[l]+" Buffer: "+l);
                    System.out.println("Longitud N: "+buffer[l+1]);
                    switch (buffer[l]) {//opcion
                        case 1: //submask
                            break;
                        case 50:
                            break;
                        case 53://Tipo de mensaje
                            tipoDHCP=buffer[l+2];
                            System.out.println("Tipo: : "+tipoDHCP);
                            if(tipoDHCP== 1) {
                                System.out.println("Tipo: Discover Estado: "+Estado);
                                if(Estado== 0){
                                        .....
                                        .....
                                        .....
                                        byte[] buffer2 = msgOffer(); // obtiene el paquete DHCP offer a enviar
                                        int length2 = buffer2.length;
                                        DatagramPacket paquete2 = new DatagramPacket(buffer2, length2,InetAddress.getByName("255.255.255.255"),68);
                                        System.out.println("Data Enviada: " + Arrays.toString(paquete2.getData()));
 
                                        socket.send(paquete2);
 
                                    .....
                                    .....
                                    .....
                                    }
                                }
                            }
                            break;
                            .....
                            .....
                            .....
 
                    }
                    longOp=buffer[l+1];
                    if(longOp<0){longOp=longOp+256;
                    } l+=longOp+1;
                }if(buffer[l]==-128)break;
            }System.out.println("Termina de leer");
 
 
        }else System.out.println("El mensaje recibido no es de envio");
 
        }else System.out.println("El mensaje recibido no se encuentra dentro de lo equipos administrados");
    }
} catch (SocketException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
 
}

Si me pudieran ayudar se los agradecería mucho.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda, send() no envía el datagrama

Publicado por Tom (1570 intervenciones) el 04/08/2018 21:58:39
creo que en algún punto entre:
socket.receive(paquete);
y recorrer el buffer con:
for(l=240; l<548; l++)
deberías hacer una comprobación del tamaño de lo recibido ...
Por otra parte, esa IP indica que envías "broadcast" ¿ no ?
Pues probablemente debas echare un ojo a esto:

https://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html#setBroadcast(boolean)

y buscar SO_BROADCAST aquí:

http://man7.org/linux/man-pages/man7/socket.7.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar