2010-08-07 22 views

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

+0

Örnek gösterebilir misiniz? 17 baytlık bir basit udp paketi göndermeyi denedim, sadece veri olarak gönderir. –

+0

boş bir datagram veya 1 bayt datagram bile bu davranışı gösterir? Ne kadar toplam bayt (ethernet + ip + udp) size gösterir? – nos

+0

60 bytes ....... –