IP地址和二进制IP地址之间的转换

       我们看到的IP通常是类似于127.0.0.1这样的字符串,然而计算机理解的则是像0x01111111100000000000000000000001(127.0.0.1)这样的ip地址方式。

对于Linux系统而言有一组函数是专门处理这块的:

#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
/*将IP地址装换为地址结构in_addr值*/
int inet_aton(const char *cp, strcut in_addr *inp);
/*将字符串转换为in_addr值*/
in_addr_t inet_addr(const char *cp);
/*将字符串地址的网络部分转为in_addr值*/
in_addr_t inet_network(const char *cp);
/*将in_addr转为字符串*/
char *inet_ntoa(strcut in_addr in);
/*将网络地址和主机地址合成为IP地址*/
struct in_addr inet_makeaddr(int net, int host);
/*获得地址的主机部分*/
in_addr_t inet_lnaof(strcut in_addr in);
/*获得地址的网络部分*/
in_addr_t inet_netof(strcut in_addr in);

/*安全可重入地址转换函数*/
/*将字符串转换为in_addr值*/
int inet_pton(int af, const char *src, void *dst);
/*将in_addr转为字符串*/
int inet_ntop(int af, const void *src, char *dst, socklen_t cnt);

1.inet_aton()

将cp中存储的点分十进制字符串类型的IP地址转换为二进制IP地址,保存在inp结构体指针中,返回0为成功。

2.inet_addr()

可以理解inet_aton的缩减版,返回值-1表示非法参数。

注意:由于-1(1111111111111111)同时可以理解为合法ip地址255.255.255.255的转换结果,所以不能用这个函数转换255.255.255.255.

3.inet_network()

与inet_addr不同的是,cp可能是以下值:

  • a.b.c.d 这种情况是一个完全的IP地址转换,与inet_addr完全一致
  • a.b.c 这种情况指定了IP的前三个段,a.b解释为IP前16位,c解释为后16位,例如127.16.888会将888解释为IP的后16位
  • a.b 则会将a作为IP的前8位,b解释为后面的24位
  • a 当仅为一部分时,a的值直接作为IP地址,不做字节序转换

4.inet_ntoa()

/将in_addr转为字符串,但是注意该函数不是线程安全函数,因为转换的内存区域时静态的

5.inet_makeaddr()inet_lnaof() inet_netof()

IP地址分为网络地址和主机地址,通常前16位为网络地址,后16位为主机地址

6.inet_pton()

af:表示网络协议族, IPV4 下的值为AF_INET, src 为需要转换的字符串;dst为指向struct in_addr的指针,返回-1时通常是af的协议族不支持

7.inet_ntop()

af:表示网络协议族, IPV4 下的值为AF_INET, src 为指向struct in_addr的指针;dst为字符串,cnt为缓存区大小。

猜你喜欢

转载自blog.csdn.net/huang422600/article/details/121586378
今日推荐