printf“__be32”值类型

时间:2013-07-04 15:07:56

标签: c linux ip

我使用这个“struct iphdr * ip_reply”来读取带有此功能的接收数据包:

  

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

     

ip_reply =(struct iphdr *)buffer; // casting =>从收到的数据包中读取ip头

这是struct参数:

      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”?

2 个答案:

答案 0 :(得分:1)

使用正确的function:ntohl()

此函数用于转换网络到主机(这就是为什么它的名称以ntoh开头),您不必关心系统的结束:如果需要,C库将为您翻译它

答案 1 :(得分:0)

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

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