1

私はパッケージを送受信するプログラムを書いています。ICMP プロトコル経由でデータを送信することには問題はありませんが、ホスト IP や ICMP コードなどの情報を取得することには問題があります。

コード 8 (「エコー リクエスト」) を使用してプログラムを介してパッケージを送信し (動作)、コンピューターはコード 0 (「エコー リプライ」) またはコード 11 (「時間超過」) を受け取ります。Wiresharkで確認しました。

受信したパッケージで ICMP に関する情報を取得する方法がわかりません。私のプログラムの一部:

socklen_t addrlen = sizeof(connection);
if (recvfrom(sockfd, buffer, sizeof(struct iphdr) + sizeof(struct icmphdr), 0, (struct sockaddr *)&connection, &addrlen) == -1) {
    perror("recv");
} else {
    ip_reply = (struct iphdr*) buffer;
    printf("ID: %d\n", ntohs(ip_reply->id));
    printf("TTL: %d\n", ip_reply->ttl);
}

受信したホストのIPとICMPコードの情報が欲しいです。

「iphdr」構造内に「saddr」および「daddr」というフィールドがあることは知っています。ただし、「_be32」タイプがあります。「char*」に変換する方法がわかりません。

前もって感謝します :)

4

1 に答える 1

1
#include <netinet/ip_icmp.h>

...
...
...
your recvfrom
...

// first, verify the ip packet contains a ICMP
if (ip_reply->protocol == 1)
{
    // ok, it contains ICMP data
    printf("Received ICMP message from IP: %s\n", inet_ntoa(connection.sin_addr));

    // make the icmphdr struct point to the right offset
    struct icmphdr *icmp = (struct icmphdr *)((uint32_t *)ip_reply + ip_reply->ihl);

    // print what you want
    printf("ICMP type: %u\n", icmp->type);
    printf("ICMP code: %u\n", icmp->code);
}
于 2013-04-10T09:35:01.893 に答える