C++のRAWソケットを使用して、すべてのICMP "宛先到達不能 - ポート到達不能"メッセージをキャッチしようとしています。次に、基礎となるUDPプロトコルを処理して、宛先に到達できなかったポートを検出します。これまでのところ、私はICMPメッセージを受信し、そのタイプとコードに基づいてフィルタリングしました。しかし、私はudpヘッダーにアクセスするのに苦労しています。ICMPメッセージからUDPにアクセスする
*(struct udphdr*)(icmp + sizeof(struct icmphdr) + sizeof(struct iphdr))
と
struct iphdr *ip = (struct iphdr*)ether_frame;
struct icmphdr *icmp = (struct icmphdr*)(ether_frame + ip->ihl*4);
struct iphdr *ip2 = (struct iphdr*)(icmp + sizeof(struct icmphdr))
struct udphdr *udphdr = (struct udphdr*)(ip2 + ip2->ihl*4)
しかし、どちらもが働いていた:これまでのところ私はこれらを試してみました。私はそれが単純なポインタの算術ミスであると確信していますが、私はそれを理解することはできません。だから私の質問は次のとおりです。プロトコルはどのくらい正確にICMPレスポンスで編成されていますか?未処理のicmp応答から到達できなかったポート番号にどのようにアクセスできますか?
EDIT:this->rcv_sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP
を使用して作成された応答がether_frame
サイズIP_MAXPACKET
のuint8_t
配列でrecv(this->rcv_sd, ether_frame, IP_MAXPACKET, 0)
を使用して受信される受信するために使用されるソケット。
"*プロトコルはどのくらい正確にICMPレスポンスで整理されていますか?" - Wiresharkなどのパケットスニファ+アナライザを使用して実際のパケット構造を確認することをお勧めします。 –
もちろん、私はそれをしましたが、私の最初のtry( 'struct udphdr *)(icmp + sizeof(struct icmphdr)+ sizeof(struct iphdr)')は、 wireshark。 – sveatlo
はい、それ以外の場合は、icmpのタイプとコードに基づいてフィルタリングできませんでした。私もgdbでそれらを見て、内容は(予想どおり)wiresharkで見た内容と同じでした。 – sveatlo