मैं कच्चे सॉकेट का उपयोग करके ओएएम ईथरनेट फ्रेम भेजने की कोशिश कर रहा हूं। मैं ऐसा करने में सफल रहा था।प्रेषण फ़ंक्शन कच्चे सॉकेट भेजते समय संरचना 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
क्षेत्र की जरूरत क्या है? मैनुअल का कहना है कि यह गंतव्य मैक पता है।