我使用这个“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”?
答案 0 :(得分:1)
使用正确的function:ntohl()
此函数用于转换网络到主机(这就是为什么它的名称以ntoh开头),您不必关心系统的结束:如果需要,C库将为您翻译它
答案 1 :(得分:0)
libc中有一组函数可以处理这些转换。在您的情况下,您可以使用以下功能:inet_ntoa()
。基本上,它以网络二进制格式(网络字节顺序)获取地址,并使用点表示法将IPv4地址检索到字符串中。
如果您使用的是unix SO,我建议您查看手册页以查看正确的用法。