2013-04-26 5 views
6

मैं कच्चे सॉकेट का उपयोग करके ओएएम ईथरनेट फ्रेम भेजने की कोशिश कर रहा हूं। मैं ऐसा करने में सफल रहा था।प्रेषण फ़ंक्शन कच्चे सॉकेट भेजते समय संरचना sockaddr_ll में प्रदान किए गए मैक पते का उपयोग नहीं करता

भेजने समारोह मैं लिखा है है:

int send_frame(sock_info *info,char *buf,int length) 
    { 
     struct sockaddr_ll dest_addr; 
     memset(&dest_addr,0,sizeof(struct sockaddr_ll)); 
     dest_addr.sll_family = PF_PACKET; 
     dest_addr.sll_protocol = htons(8902); 
     dest_addr.sll_ifindex = info->if_index; 
     dest_addr.sll_halen = ETH_MAC_ADDR_LEN; 
     dest_addr.sll_pkttype = PACKET_OTHERHOST; 
     dest_addr.sll_hatype = ARPHRD_ETHER; 
     memset(dest_addr.sll_addr,0,8); 

     dest_addr.sll_addr[0] = 0x00; 
     dest_addr.sll_addr[1] = 0xE0; 
     dest_addr.sll_addr[2] = 0x0C; 
     dest_addr.sll_addr[3] = 0x00; 
     dest_addr.sll_addr[4] = 0x95; 
     dest_addr.sll_addr[5] = 0x02; 

     return sendto(info->sock_fd, buf, length, 0, (struct sockaddr*) &dest_addr, sizeof(struct sockaddr_ll)); 
    } 

मैं पैकेट wireshark का उपयोग कर कब्जा करने में असमर्थ था। बहुत सारी चीजों की कोशिश करने के बाद, मुझे पता चला कि बफर को भेजने के लिए सभी ईथरनेट फ्रेम फ़ील्ड (गंतव्य पते से शुरू होना चाहिए) होना चाहिए। जब मैंने बफर में गंतव्य और स्रोत पता और अन्य ईथरनेट फ़ील्ड जोड़े, तो मैं वायरशर्क का उपयोग करके पैकेट को कैप्चर करने में सक्षम था। तो प्रेषण समारोह dest_addr.sll_addr में संग्रहीत मैक पते का उपयोग नहीं करता है।

मेरा प्रश्न है, तो फिर struct sockaddr_ll में sll_addr क्षेत्र की जरूरत क्या है? मैनुअल का कहना है कि यह गंतव्य मैक पता है।

उत्तर

3

मेरे लिए यह लगता है कि यह काम करता है मैन्युअल पृष्ठ के रूप में वर्णन (आदमी 7 पैकेट):

SOCK_RAW पैकेट पैकेट डेटा में किसी भी बदलाव के बिना के लिए और डिवाइस ड्राइवर से पारित कर रहे हैं। एक पैकेट प्राप्त करते समय, पता अभी भी पार्स किया गया है और एक मानक sockaddr_ll पता संरचना में पारित किया गया है। पैकेट को प्रेषित करते समय, उपयोगकर्ता द्वारा प्रदान किए गए बफर में भौतिक परत शीर्षलेख होना चाहिए। उस पैकेट को गंतव्य पते द्वारा परिभाषित इंटरफ़ेस के नेटवर्क ड्राइवर पर अनमोडिफाइड किया गया है। कुछ डिवाइस ड्राइवर हमेशा अन्य शीर्षलेख जोड़ते हैं। SOCK_RAW के समान है लेकिन लिनक्स 2.0 के अप्रचलित PF_INET/SOCK_PACKET के साथ संगत नहीं है।

यहां बफर sendto() के दूसरे पैरामीटर को संदर्भित करता है। इसलिए, stuct sockaddr_ll का उपयोग केवल कॉलर को डेटा वापस करने के लिए किया जाता है, RAW पैकेट को प्रारूपित करने के लिए नहीं। शायद आप SOCK_DGRAM या libpcap के बजाय उपयोगकर्ता को चाहते हैं?

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