1

我正在编写一个程序来发送和接收包裹。我通过 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*'。

提前致谢 :)

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 回答