2010-08-07 10 views
6

मैं एक ईथरनेट ट्रेलर के साथ डेटाग्राम कैसे भेज सकता हूं? अगर मैं सॉकेटटाइप.रॉ का उपयोग करता हूं, तो मुझे पूरा आईपी हेडर भेजना होगा और मुझे नहीं पता कि यह कैसे करना है।मैं एक ईथरनेट ट्रेलर के साथ डेटाग्राम कैसे भेज सकता हूं?

उत्तर

2

शायद ऐसा कुछ?

 
#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); 

} 

यह एक कच्चे पैकेट देना चाहिए जिसे आप वायरशर्क पर देख सकते हैं। यदि आप आईपी ईडर चाहते हैं, या इसे एक udp या ऐसा कुछ बनाते हैं तो आप इस विधि का उपयोग कर सकते हैं और हेडर स्वयं बना सकते हैं (यह आरएफसीएस पर मामूली रूप है या अन्य पैकेट हेडर के समूह को देखने के लिए केवल वायरशर्क का उपयोग करें) । ध्यान दें कि udp के लिए आपको चेकसम 0x0000 की गणना करने की आवश्यकता नहीं है एक वैध चेकसम है जिसे पारित करना है।

यदि आप चाहते हैं कि अंत में शून्य के साथ एक udp पैकेट है जो कुछ हद तक समान है, तो शायद मुझे बताएं।

2

वह ट्रेलर पैड ईथरनेट फ्रेम को उनकी न्यूनतम लंबाई (पेलोड के 46 बाइट्स) में उपयोग किया जाता है। तो एक छोटा यूडीपी पैकेट भेजें - 18 बाइट से छोटा (जैसे आईपी + यूडीपी सामान्यतः 28 बाइट्स है)

+0

क्या आप एक उदाहरण दिखा सकते हैं? मैंने 17 बाइट्स के साथ एक साधारण udp पैकेट भेजने की कोशिश की, यह सिर्फ डेटा के रूप में भेजता है। –

+0

यहां तक ​​कि एक खाली डेटाग्राम, या 1 बाइट डेटाग्राम इस व्यवहार को दिखाता है? कुल कितने बाइट्स (ईथरनेट + आईपी + udp) ने आपको ईथरियल दिखाया? – nos

+0

60 बाइट ....... –

संबंधित मुद्दे