Ethernet fragmanıyla bir datagramı nasıl gönderebilirim? SocketType.Raw kullanırsam, tüm IP üstbilgisini yollamalıyım ve bunu nasıl yapacağımı bilmiyorum. Römork asgari uzunluğa ped Ethernet çerçeveler için kullanılan buEthernet fragmanıyla bir datagramı nasıl gönderebilirim?
6
A
cevap
2
şey (IP + UDP olarak normalde 28 bayt)?
#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); }
Bu, wireshark'ta görebileceğiniz ham bir paket vermelidir. Eğer ip eader varsa, ya bunu bir udp veya bu yöntemi kullanmak ve başlığını kendiniz oluşturabilirsiniz böyle birşey yapmak istiyorsanız (bu RFC'lere en önemsiz bakmak ya da sadece diğer paket başlıklarının bir demet bakmak için wireshark kullanın) . Udp için bir sağlama toplamı hesaplamanız gerekmediğini unutmayın. 0x0000, üzerinden geçmesi gereken geçerli bir sağlama toplamıdır.
istediğin biraz muhtemelen daha kolay, bana bildirin, aynı ucunda sıfırlı bir udp paket ise.
2
(yük 46 bayt). Yani küçük bir UDP paket göndermek - daha küçük 18 bayt belki böyle
Örnek gösterebilir misiniz? 17 baytlık bir basit udp paketi göndermeyi denedim, sadece veri olarak gönderir. –
boş bir datagram veya 1 bayt datagram bile bu davranışı gösterir? Ne kadar toplam bayt (ethernet + ip + udp) size gösterir? – nos
60 bytes ....... –