国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

Linux網絡編程——原始套接字實例:MAC 頭部報文分析

2024-06-28 13:21:19
字體:
來源:轉載
供稿:網友
linux網絡編程——原始套接字實例:MAC 頭部報文分析

通過《Linux網絡編程——原始套接字編程》得知,我們可以通過原始套接字以及recvfrom( ) 可以獲取鏈路層的數據包,那我們接收的鏈路層數據包到底長什么樣的呢

鏈路層封包格式

MAC 頭部(有線局域網)

注意:CRC、PAD 在組包時可以忽略

鏈路層數據包的其中一種情況:

1 unsigned char msg[1024] = {2     //--------------組MAC--------14------3     0xb8, 0x88, 0xe3, 0xe1, 0x10, 0xe6, // dst_mac: b8:88:e3:e1:10:e64     0xc8, 0x9c, 0xdc, 0xb7, 0x0f, 0x19, // src_mac: c8:9c:dc:b7:0f:195     0x08, 0x00,                         // 類型:0x0800 ip協議6     // …… ……7     // …… ……8 };

接收的鏈路層數據包,并對其進行簡單分析:

 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <sys/socket.h> 5 #include <netinet/in.h> 6 #include <arpa/inet.h> 7 #include <netinet/ether.h> 8  9 int main(int argc,char *argv[])10 {11     int i = 0;12     unsigned char buf[1024] = "";13     int sock_raw_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));14     while(1)15     {16         unsigned char src_mac[18] = "";17         unsigned char dst_mac[18] = "";18         //獲取鏈路層的數據幀19         recvfrom(sock_raw_fd, buf, sizeof(buf),0,NULL,NULL);20         //從buf里提取目的mac、源mac21         sPRintf(dst_mac,"%02x:%02x:%02x:%02x:%02x:%02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);22         sprintf(src_mac,"%02x:%02x:%02x:%02x:%02x:%02x", buf[6], buf[7], buf[8], buf[9], buf[10], buf[11]);23         //判斷是否為IP數據包24         if(buf[12]==0x08 && buf[13]==0x00)25         {    26             printf("______________IP數據報_______________/n");27             printf("MAC:%s >> %s/n",src_mac,dst_mac);28         }//判斷是否為ARP數據包29         else if(buf[12]==0x08 && buf[13]==0x06)30         {31             printf("______________ARP數據報_______________/n");32             printf("MAC:%s >> %s/n",src_mac,dst_mac);33         }//判斷是否為RARP數據包34         else if(buf[12]==0x80 && buf[13]==0x35)35         {36             printf("______________RARP數據報_______________/n");37             printf("MAC:%s>>%s/n",src_mac,dst_mac);38         }39     }40     return 0;41 }

記得以管理者權限運行程序:

每個報文頭部都有一個相應的結構體,通過這些結構體對報文進行相應的組包或拆包會方便很多。

Ubuntu 12.04 中描述網絡協議結構的文件如下:

以太網頭部(所需要頭文件:#include <net/ethernet.h>):

上面的例子,改為用結構體實現,如下:

 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <sys/socket.h> 5 #include <netinet/in.h> 6 #include <arpa/inet.h> 7 #include <netinet/ether.h> 8 #include <net/ethernet.h>          // 以太網頭部 頭文件     9 #include <netinet/ip.h>            // ip頭部 頭文件10 // #include <net/if_arp.h>            // arp頭部 頭文件11 12 int main(int argc,char *argv[])13 {14     int i = 0;15     unsigned char buf[1024] = "";16     int sock_raw_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));17     while(1)18     {19         unsigned char src_mac[18] = "";20         unsigned char dst_mac[18] = "";21         //獲取鏈路層的數據幀22         recvfrom(sock_raw_fd, buf, sizeof(buf),0,NULL,NULL);23         24         //從數據中提取mac首部信息(14個字節)25         struct ether_header *ethdr = NULL;26         ethdr = (struct ether_header *)buf;27         28         //從buf里提取目的mac、源mac29         sprintf(dst_mac,"%02x:%02x:%02x:%02x:%02x:%02x", ethdr->ether_dhost[0], ethdr->ether_dhost[1],ethdr->ether_dhost[2],ethdr->ether_dhost[3],ethdr->ether_dhost[4],ethdr->ether_dhost[5]);30         sprintf(src_mac,"%02x:%02x:%02x:%02x:%02x:%02x", ethdr->ether_shost[0], ethdr->ether_shost[1],ethdr->ether_shost[2],ethdr->ether_shost[3],ethdr->ether_shost[4],ethdr->ether_shost[5]);31         32         //判斷是否為IP數據包33         if( 0x0800 == ntohs(ethdr->ether_type) )34         {    35             printf("______________IP數據報_______________/n");36             printf("MAC:%s >> %s/n",src_mac,dst_mac);37             38         }//0x0806為ARP數據包, 0x8035為RARP數據包39         else if( 0x0806 == ntohs(ethdr->ether_type) || 0x8035 == ntohs(ethdr->ether_type) )40         {41             printf("______________ARP數據報_______________/n");42             printf("MAC:%s >> %s/n",src_mac,dst_mac);43         }44         45     }46     return 0;47 }

轉自:http://blog.csdn.net/tennysonsky/article/details/44751997


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沙田区| 藁城市| 乌拉特前旗| 邢台县| 原阳县| 山丹县| 墨竹工卡县| 光山县| 舒城县| 临武县| 年辖:市辖区| 长葛市| 陇南市| 兰考县| 防城港市| 枣庄市| 黄浦区| 徐汇区| 唐海县| 莎车县| 怀集县| 柞水县| 鞍山市| 浙江省| 南岸区| 楚雄市| 哈尔滨市| 夏邑县| 永吉县| 道孚县| 扎囊县| 英吉沙县| 固阳县| 敦化市| 台东县| 海南省| 和田县| 锡林郭勒盟| 彭泽县| 京山县| 佛冈县|