您必須分別解析每個幀,併爲每個要計數的值設置一個計數器。假設你正在檢查的捕獲是pcap/pcapng格式,你可能會發現libpcap很有幫助。
爲了讓的你威力要做(假設較低的水平是沒有以太網VLAN標記)一個快速運行
uint64_t ip_count, tcp_count, udp_count;
void parse_pkt(uint8_t *data, uint32_t data_len) {
uint8_t *ether_hdr = data;
uint16_t ether_type = ntohs(*(uint16_t *) (data + 12))
if (ether_type != 0x800) {
return;
}
ip_count += 1;
uint8_t *ip_hdr = data + 14;
protocol = ntohs(*(uint16_t *) (ip_hdr + 9))
//protocol is either udp/tcp/sctp...etc
if (protocol == 0x11) {
udp_count++;
} else if (protocol == 0x06) {
tcp_count++;
}
}
// foreach pkt from libpcap_open call parse_pkt with the data and data_len
此代碼是脆弱的。沒有適當的長度和類型檢查而直接跳過偏移不是一個好主意。
_「我想在不使用任何外部庫的情況下做到這一點」_ - 然後深入規範並重新發明輪子。問我們如何這樣做太廣泛。 – CodeCaster
pcap捕獲像他們在電線上的數據。要知道它是IP,TCP,UDP ..你必須瞭解這些協議是如何傳輸的。你不會在pcap規範中找到這些東西,但是在IP,TCP ...規範中。 –