structin_addr结构体
struct in_addr 结构体:
struct in_addr {
in_addr_t s_addr;
};
表⽰⼀个32位的IPv4地址。
in_addr_t⼀般为32位的unsigned int,其字节顺序为⽹络字节序,即该⽆符号数采⽤⼤端字节序。其中每8位表⽰⼀个IP地址中的⼀个数值。打印的时候可以调⽤inet_ntoa()函数将其转换为char*类型。
头⽂件为:#include <arpa/inet.h>
inet——ntoa()函数⽤于将⼀个⼗进制⽹络字节序转换为点分⼗进制IP格式的字符串。
函数原型为:char*inet_ntoa(struct in_addr in);
头⽂件为:arpa/inet.h
⽹络字节序和主机字节序⽐较容易混乱(⼤端表⽰和⼩端表⽰)。
⽹络字节序采⽤⼤端表⽰,就是数据的⾼位要存放到低地址。
include意思⽽⼤多数主机字节序采⽤⼩端表⽰(也有采⽤⼤端表⽰的主机字节序),就是数据的低位放到低地址。
⽐如⽆符号整型1338378,的⼆进制表⽰为:
数据的⾼位----------------------------》数据的地位
00000000 00010100 01101100 00001010
所以采⽤⼩端表⽰的主机字节序时,内存中存放的形式为:
低地址----------------------------------------》⾼地址
00001010 01101100 00010100 00000000
所以可以⾃⼰写个⼩程序来代替inet_ntoa()函数。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void toStringIP(const unsigned int ip,char *stringIP);
int main()
{
unsigned int ip=1338378;
char* stringIP = (char*)malloc(16);
memset(stringIP,0,16+1);
toStringIP(ip,stringIP);
puts(stringIP);
return0;
}
void toStringIP(const unsigned int ip,char *stringIP)
{
unsigned int tempIP=ip;
for(int i=0;i<3;i++)
{
unsigned char part=(char)tempIP;
char temp[4];
sprintf(temp,"%d.",part);
strcat(stringIP,temp);
tempIP=tempIP>>8;
}
unsigned char part=(char)tempIP;
char temp[4];
sprintf(temp,"%d",part);
strcat(stringIP,temp);
}
如果您觉得对您有帮助,请点赞哦^^
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论