2010-08-07 7 views

Répondre

2

Quelque chose comme ça peut-être?

 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#include <unistd.h> 

#include <sys/socket.h> 
#include <linux/if_packet.h> 
#include <linux/if_ether.h> 
#include <linux/if_arp.h> 

#include <sys/ioctl.h> 

int s; 

unsigned char buffer[513]; 

struct sockaddr_ll socket_address; 

int main (void) 
{ 
    unsigned char seq; 
    unsigned int ra; 
    int length; 
    struct ifreq ifr; 

    s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); 
    if (s == -1) 
    { 
     printf("error creating socket\n"); 
     return(1); 
    } 

    memset(&ifr,0, sizeof(struct ifreq)); 
    strncpy(ifr.ifr_name,"eth0",IFNAMSIZ); 
    if(ioctl(s, SIOCGIFINDEX, &ifr) < 0) 
    { 
     perror("ioctl SIOCGIFINDEX"); 
     exit(1); 
    } 

    printf("index %d\n",ifr.ifr_ifindex); 


    printf("socket created\n"); 

    memset(&socket_address,0,sizeof(socket_address)); 

    socket_address.sll_family = PF_PACKET; 
    socket_address.sll_protocol = htons(ETH_P_ALL); 
    socket_address.sll_ifindex = ifr.ifr_ifindex; 

    if (bind(s, (struct sockaddr *)(&socket_address), sizeof(socket_address)) < 0) 
    { 
     perror("bind error"); 
     exit(1); 
    } 

    printf("bound\n"); 

    length=27; 

    memset(buffer,0,sizeof(buffer)); 
//destination 
    buffer[ 0]=0xFF; 
    buffer[ 1]=0xFF; 
    buffer[ 2]=0xFF; 
    buffer[ 3]=0xFF; 
    buffer[ 4]=0xFF; 
    buffer[ 5]=0xFF; 
//source 
    buffer[ 6]=0x00; 
    buffer[ 7]=0x19; 
    buffer[ 8]=0xd1; 
    buffer[ 9]=0x02; 
    buffer[10]=0xdc; 
    buffer[11]=0xb3; 
//length 
    buffer[12]=((length-14)>>8)&0xFF; 
    buffer[13]=((length-14)>>0)&0xFF; 
//payload 
    buffer[14]=0x12; 
    buffer[15]=0x34; 

    for(ra=0;ra<20;ra++) 
    { 
     buffer[16]=ra; 
     if(send(s,buffer,length,0) < 0) 
     { 
      printf("sendto failed\n"); 
      break; 
     } 
     else 
     { 
      printf("sent\n"); 
     } 
    } 

    close(s); 
    return(1); 

} 

Cela devrait donner un paquet cru que vous pouvez voir sur Wireshark. si vous voulez avoir l'ip eader, ou en faire un udp ou quelque chose comme ça, vous pouvez utiliser cette méthode et construire l'en-tête vous-même (il est trivial de regarder les rfcs ou simplement utiliser wireshark pour voir un tas d'autres en-têtes) . Notez que pour udp vous n'avez pas besoin de calculer une somme de contrôle 0x0000 est une somme de contrôle valide qui est censée passer à travers.

Si tout ce que vous voulez est un paquet udp avec des zéros à la fin qui est un peu le même, probablement plus facile, faites le moi savoir.

2

Cette bande-annonce est utilisée pour garnir les trames ethernet à leur longueur minimale (46 octets de charge utile). Donc, envoyez un petit paquet UDP - plus petit que 18 octets (comme IP + UDP est normalement de 28 octets)

+0

Pouvez-vous montrer un exemple s'il vous plaît? J'ai essayé d'envoyer un paquet udp simple avec 17 octets, il l'envoie juste comme données. –

+0

même un datagramme vide, ou un datagramme de 1 octet montre ce comportement? Combien d'octets totaux (ethernet + ip + udp) avez-vous montré? – nos

+0

60 octets ....... –

Questions connexes