Send() return -1 en C

Iniciado por soyloqbuskas, 1 Noviembre 2012, 02:56 AM

0 Miembros y 1 Visitante están viendo este tema.

soyloqbuskas

¡Buenas a todos!

Tengo un problema con la funcion send(). Siempre me retorna -1 y no se porque....

El socket lo creo asi:
int CreateRawSocket(int protocol_to_sniff){
//Crea un raw socket
       int rawsock;
       if((rawsock = socket(PF_PACKET, SOCK_RAW, htons(protocol_to_sniff)))== -1)
       {
               perror("Error creating raw socket: ");
               exit(-1);
       }


       return rawsock;
}


El bind lo hago asi:
int BindRawSocketToInterface(char *device, int rawsock, int protocol){
//Hace un bind del socket con la interfaz de red

       struct sockaddr_ll sll;
       struct ifreq ifr;

       bzero(&sll, sizeof(sll));
       bzero(&ifr, sizeof(ifr));

       strncpy((char *)ifr.ifr_name, device, IFNAMSIZ);
       if((ioctl(rawsock, SIOCGIFINDEX, &ifr)) == -1)
       {
               printf("Error getting Interface index !\n");
               exit(-1);
       }

       sll.sll_family = AF_PACKET;
       sll.sll_ifindex = ifr.ifr_ifindex;
       sll.sll_protocol = htons(protocol);


       if((bind(rawsock, (struct sockaddr *)&sll, sizeof(sll)))== -1)
       {
               perror("Error binding raw socket to interface\n");
               exit(-1);
       }

       return 1;

}


Luego creo un char * con los datos a enviar y lo envio con esta funcion:
int SendRawPacket(int rawsock, char *pkt, int pkt_len){
//Envia un raw packet
       int sent=0;
   
       if((sent = send(rawsock, pkt, pkt_len,TH_FLAGS)) != pkt_len)
       {
               /* Error */
               printf("Could only send %d bytes of packet of length %d\n", sent, pkt_len);
               return 0;
       }

       return 1;
}


Y la funcion send() siempre me retorna -1 y no se porque...El socket esta bien creado...lo he mirado con gdb y tengo la variable rawsock=8. Y la variable pkt_len=strlen(pkt)=54

Si el socket esta bien creado y el bind es correcto...¿Por que no me envia los datos?

Gracias, un saludo.
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

soyloqbuskas

Una pregunta....¿Es posible que el error sea por que creo 2 sockets? es decir, ¿una aplicacion de C en linux solo puede abrir un solo sockect?

Es que ya no se me ocurren mas ideas....
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

BlackZeroX

La pregunta del millón a quien le quieres enviar los datos?... si no mal recuerdo en este tipo de sockets debes crearles el header respectivo cuando quieres usar send()...

Dulces Lunas!¡.
The Dark Shadow is my passion.

soyloqbuskas

Pues...creo que si....el socket lo asocio con un bind() a la interfaz de red wlan0 y el paquete que le mando tiene un struct ethdr + struct iphdr + struct tcphdr , deberia mandar algon antes del struct ethdr??
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw