1

我使用这个“struct iphdr * ip_reply”来读取这个函数接收到的数据包:

recvfrom(sockfd, buffer, sizeof(struct iphdr) + sizeof(struct icmphdr), 0, (struct sockaddr *)&connection, &addrlen))

ip_reply = (struct iphdr*) 缓冲区;// 强制转换 => 从接收到的数据包中读取 ip 标头

这是结构参数:

      struct iphdr {  #if defined(__LITTLE_ENDIAN_BITFIELD)
     __u8    ihl:4,
            version:4;  #elif defined (__BIG_ENDIAN_BITFIELD)
     __u8    version:4,
             ihl:4;

   __u8    tos;
   __be16  tot_len;
   __be16  id;
   __be16  frag_off;
   __u8    ttl;
   __u8    protocol;
   __sum16 check;
   __be32  saddr;
   __be32  daddr;
    /*The options start here. */  };

如何使用 printf 显示“saddr”“daddr”?

4

2 回答 2

1

使用正确的函数:ntohl()

此函数旨在用于将网络转换为主机(这就是它的名称以 ntoh 开头的原因),您不必关心系统的字节序:如果需要,C 库会为您翻译它。

于 2013-07-04T15:19:56.257 回答
1

libc 中有一组函数可以处理这些转换。在您的情况下,您可以使用以下功能:inet_ntoa(). 基本上,它以网络二进制格式(网络字节顺序)获取地址,并使用点表示法将 IPv4 地址检索到字符串中。

如果您使用的是 unix SO,我建议您查看手册页以了解正确的用法。

于 2013-07-04T15:51:05.330 回答