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)
- 1. Comment envoyer un paquet Ethernet brut avec C#?
- 2. Envoyer plusieurs données dans un seul datagramme UDP
- 3. Envoyer un flux de bureau via datagramme en Java
- 4. Transférer des bits dans un datagramme IP (IPv4)
- 5. Comment usurper une adresse MAC ethernet de l'interface Ethernet câblée avec MacBookPro et Leopard 10.5.6?
- 6. iTextSharp IOException "Remorque non trouvée"
- 7. Frais généraux avec PPP et Ethernet
- 8. Types Ethernet
- 9. Quand utiliser WCF duplex vs datagramme?
- 10. Datagramme provenant du "mauvais" IP
- 11. Comment supprimer une couche Ethernet d'un fichier pcap?
- 12. Connexion série rs-232 via un câble Ethernet (tcp)
- 13. Envoyer une image avec un message
- 14. linux raw socket ethernet se lier à un protocole spécifique
- 15. Python | Comment envoyer une réponse JSON avec un nom assigné
- 16. Comment envoyer un objet JSON via une requête avec Android?
- 17. comment envoyer une demande de poste avec un navigateur Web
- 18. Comment envoyer une adresse multiple avec MSbuild
- 19. Flux vidéo sur Ethernet
- 20. Comment choisir InfiniBand ou Ethernet par programme?
- 21. Comment envoyer une requête HEAD avec HtmlUnit?
- 22. Comment envoyer un email avec PHP?
- 23. Comment envoyer un fichier avec jax-rs
- 24. Comment envoyer un dateTime vide avec NUSOAP?
- 25. Comment envoyer un email avec django-registration?
- 26. Comment envoyer un formulaire automatiquement avec Greasemonkey?
- 27. Comment envoyer un message direct avec Twitter?
- 28. Connexion Ethernet au simulateur iPhone
- 29. Envoyer un NSString avec \ 0
- 30. Implémenter Raw Ethernet dans Winsock
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 ....... –