TCP/IP笔记-Qt使用Win10pcap发送以太帧(理论与实践)
首先來(lái)介紹下以太幀理論:
以太幀是包含MAC幀的,先看下MAC幀:
目的地址:接收幀的網(wǎng)絡(luò)適配器的物理地址(MAC地址);
源地址:發(fā)送幀的網(wǎng)絡(luò)適配器的物理地址(MAC地址);
類型:上層協(xié)議的類型。在處理數(shù)據(jù)時(shí)必須設(shè)置該字段,表示數(shù)據(jù)交付給哪個(gè)協(xié)議處理,如0x0800,表示交付給IP協(xié)議。
數(shù)據(jù):表示交付給上一層的數(shù)據(jù),以太幀最小為46字節(jié),最大為15000,不足46字節(jié)會(huì)自動(dòng)填充。
FCS幀校驗(yàn)序列:檢測(cè)該幀是否出錯(cuò),為4個(gè)字節(jié)。接收方會(huì)程序計(jì)算CRC,然后與FCS進(jìn)行對(duì)比,一樣則沒(méi)問(wèn)題。不一樣,則丟棄。
?
從mac層到物理層會(huì)添加前同步碼:用來(lái)使接收端的適配器在MAC幀時(shí)能夠迅速調(diào)整時(shí)鐘頻率,使得它和發(fā)送方相同。前同步碼為7字節(jié)。
幀開始定位符:幀的啟初符,1字節(jié),前6為0和1交替,后2個(gè)為連續(xù)的1,告訴適配器,幀來(lái)了。
?
實(shí)踐:
源碼如下:
pro
QT -= guiCONFIG += c++11 console CONFIG -= app_bundleDEFINES += QT_DEPRECATED_WARNINGSSOURCES += \main.cppqnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += targetINCLUDEPATH += D:/winscp/WpdPack/Include LIBS += -L D:/winscp/WpdPack/Lib/libpacket.a \-L D:/winscp/WpdPack/Lib/libwpcap.amain.cpp
#define HAVE_REMOTE#include <QCoreApplication> #include <QDebug> #include "pcap.h" #include "remote-ext.h"int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QString devName;//獲取網(wǎng)卡pcap_if_t *allDevs;char errbuf[PCAP_ERRBUF_SIZE];if(pcap_findalldevs(&allDevs, errbuf) == -1){qDebug() << "error:" << errbuf;return 0;}devName = allDevs->name;pcap_freealldevs(allDevs);//打卡網(wǎng)卡pcap_t *fp;u_char packet[100];if((fp= pcap_open(devName.toStdString().c_str(), 100, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, errbuf)) == NULL){qDebug() << "error:" << errbuf;return 0;}packet[0]=1;packet[1]=1;packet[2]=1;packet[3]=1;packet[4]=1;packet[5]=1;packet[6]=2;packet[7]=2;packet[8]=2;packet[9]=2;packet[10]=2;packet[11]=2;for(int i = 12; i < 100; i++){packet[i]=0xFF;}if(pcap_sendpacket(fp, packet, 100) != 0){qDebug() << "send error:" << pcap_geterr(fp);return 0;}qDebug() << "over";return a.exec(); }抓包如下:
可見其以太幀:
目的mac:01:01:01:01:01:01 ? ? ? 6 * 8=48位
源mac:02:02:02:02:02:02 ? ? ? ? 6 * 8=48位
類型:ff ff 2 * 8=16位
?
下面就是數(shù)據(jù)位了。
?
源碼打包下載地址:
https://github.com/fengfanchen/Qt/tree/master/EthernetNetWork
?
總結(jié)
以上是生活随笔為你收集整理的TCP/IP笔记-Qt使用Win10pcap发送以太帧(理论与实践)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Web前后端笔记-vue封装http请求
- 下一篇: 信息安全工程师笔记-综合知识冲刺(四)