Comment puis-je envoyer un datagramme avec une remorque Ethernet? Si j'utilise SocketType.Raw, je vais devoir envoyer l'en-tête IP entier et je n'ai aucune idée de comment faire cela.Comment envoyer un datagramme avec une remorque Ethernet?
Répondre
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.
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)
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. –
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
60 octets ....... –