1.生のソケット(SOCK_RAW) [物事のインターネットに偏っていますが、それでも紹介します。興味のある人はそれについて学ぶことができます]
- システムのコアに実装されているSOCK_STREAMおよびSOCK_DGRAMとは異なるソケット。
- ローカルネットワークカードにすべてのデータフレーム(データパケット)を導入できます。これは、ネットワークトラフィックの監視やネットワークデータの分析に非常に役立ちます。
- 開発者は、独自にアセンブルされたデータパケット[関連するプロトコルは以前に導入されています]をネットワークに送信できます。
- 高度なネットワークプログラミングで広く使用されています。
- ネットワークの専門家であるハッカーは通常、これを使用して特殊なネットワークプログラムを作成します。
ストリーミングソケットは、データの送受信のみが可能です:TCPSCTPプロトコルデータ
レポートソケットは送受信のみが可能です:UDPプロトコルデータ
元のソケットは送受信できます。1。カーネルカーネルがデータパケットを処理していないため、他のプロトコルにアクセスする必要があります。2。送信されたデータを使用する必要があります。元のソケット(SOCK_RAW)3。送受信機能は、図に示すようにrecvfromsendtoを使用します。
それだけです。元のソケットは、ネットワークカードから直接グリーンチャネルを介してデータを直接取得します。
2.元のソケット(SOCK_RAW)の作成
intソケット(PF_PACKET、SOCK_RAW、プロトコル)
特徴:
リンクレイヤーの元のソケットを作成します
パラメータ:
プロトコル:受信または送信できるデータパケットのタイプを指定します
ETH_P_IP:IPV4パケット
ETH_P_ARP:ARPパケット
ETH_P_ALL:任意のプロトコルタイプのデータパケット
戻り値:
成功(> 0):リンクレイヤーソケット、失敗(<0):エラー
sock_raw_fd = socket(PF_PACKET、SOCK_RAW、htons(ETH_P_ALL));
廃止され、sock_raw_fd = socket(AF_INET、SOCK_PACKET、htons(ETH_P_ALL));は使用されなくなりました 。
ヘッドファイル:
#include <sys / socket.h>
#include <netinet / ether.h>
シンプルなパケットキャプチャの実現[コードデモ]
#include <iostream>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netinet/ether.h>
#include <unistd.h>
#include <stdio.h>
using namespace std;
int32_t
main(int argc, const char* argv[])
{
unsigned char buf[1519]; // 1518 + 1
int sock_raw_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
while(1) {
unsigned char src_mac[18] = "";
unsigned char dst_mac[18] = "";
recvfrom(sock_raw_fd, buf, sizeof(buf), 0, NULL, NULL);
//"%x:%x:%x:%x:%x:%x"
sprintf((char*)dst_mac, "%02x:%02x:%02x:%02x:%02x:%02x",
buf[0],buf[1],buf[2],buf[3],buf[4],buf[5]);
// dst_mac[18] = '\0';
sprintf((char*)src_mac, "%02x:%02x:%02x:%02x:%02x:%02x",
buf[6],buf[7],buf[8],buf[9],buf[10],buf[11]);
// src_mac[18] = '\0';
printf("dst_mac: %s\nsrc_mac: %s\n", dst_mac, src_mac);
}
return 0;
}
効果: