如何在收到的包中获得有关ICMP的信息?

时间:2013-04-10 09:21:34

标签: c++ sockets icmp

我正在编写一个程序来发送和接收包。我没有通过ICMP协议发送数据的问题,但是获取主机IP或ICMP代码等信息很少。

我通过我的程序通过代码8('Echo Request')发送包(它可以工作),我的计算机接收代码0('Echo Reply')或代码11('Time Exceeded')。我在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 *'。

提前致谢:)

1 个答案:

答案 0 :(得分: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);
}