• inet_XX族函数


    在网络编程中, 经常会将网络字节转为本地字节或者将本地字节转为网络字节, 但是如果每次我们都是都通过htonl, ntohl函数需要将10进制转为整数, 甚至还用将字符串转为整数, 再转为网络字节, 或者反过来都是很麻烦的. 还好linux都是提供很方便的函数让两者之间进行转换.

    转换函数

    linux提供了多种函数满足我们任何转换的需求, 这都是inet_xxx族系列

    #include <arpa/inet.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    
    int inet_aton(const char *ip, struct in_addr *inp);	// 本地转网络
    
    char * inet_ntoa(struct in_addr inp);	// 网络转本地
    
    in_addr_t inet_addr(const char *ip);	// 返回网络字节
    
    in_addr_t inet_network(const char *ip);	// 返回本地字节
    

    接下来我们来在分析一下这几个函数

    1. inet_aton函数

    将点分十进制IP转化为网络字节序存放在inp中, 并返回该网络字节序对应的整数.

    int inet_aton(const char *ip, struct in_addr *inp);	
    

    失败 : 返回0.

    成功 : 返回IP对应的网络字节序的数.

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    
    // 传入 127.0.0.1
    int main(int argc, char *argv[])
    {
    	if(argc != 2)
    		exit(-1);
    
    	struct in_addr addr;
    	if(inet_aton(argv[1], &addr) == 0)
    		exit(-1);
    	printf("0x%08x
    ", addr.s_addr); // 0x0100007f
     
        exit(EXIT_SUCCESS);
    }
    

    2. inet_ntoa函数

    将一个32位网络字节序的二进制IP地址转换成相应的点分十进制的IP地址.

    char *inet_ntoa(struct in_addr inp);
    

    失败 : 返回NULL.

    成功 : 返回字符串指针.

    注意 : 该函数不是线程安全函数, 不可重入. 因为不同线程调用会覆盖掉其他线程的缓冲区.

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    
    int main(int argc, char *argv[])
    {
    	struct in_addr net_addr;
    	net_addr.s_addr = 0x0100007f;	// 127.0.0.1
    	char *host_addr;
    
    	host_addr = inet_ntoa(net_addr);
    	printf("%s
    ", host_addr);	// 127.0.0.1
     
        exit(EXIT_SUCCESS);
    }
    

    3. inet_addr函数

    将一个点分十进制转换网络字节序IP.

    in_addr_t inet_addr(const char *ip);
    

    失败 : 返回INADDR_NONE. 部分手册上返回的是-1, 这个问题与inet_network一样了.

    成功 : 返回网络字节IP.

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <netinet/in.h>
    
    // 输入 127.0.0.1
    int main(int argc, char *argv[])
    {
        in_addr_t addr;
    
        addr = inet_addr(argv[1]);
        printf("0x%08x
    ", addr);	// 0x0100007f
    
        exit(EXIT_SUCCESS);
    }
    

    4. inet_network函数

    将点分十进制IP转化为主机字节序

    in_addr_t inet_network(const char *ip);
    

    失败 : 返回-1.

    成功 : 返回主机对应的数.

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    
    // 输入 127.0.0.1
    int main(int argc, char *argv[])
    {
    	in_addr_t addr;
    
    	addr = inet_network(argv[1]);
    	printf("0x%08x
    ", addr);	// 0x7f000001
     
        exit(EXIT_SUCCESS);
    }
    

    该函数在某些情况下并不正确, 如果IP地址是255.255.255.255返回的则是0xffffffff, 转为十进制就是-1. 分不清出-1表示的是错误的返回值还是IP地址. 可以使用inet_pton()inet_ntop()函数来代替, 这里就不详细的分析了, 有兴趣的可以自己查一下.

    总结

    本节分析了4个函数, 重点需要掌握的是inet_aton函数.

    • 4个函数使用, 以及返回值
    • inet_network返回值的问题
    • inet_ntoa并不是线程安全的函数
  • 相关阅读:
    senrty 配置Email
    pip安装使用详解
    C_FORCE_ROOT linux环境变量设置
    Supervisord管理
    解决外部机器通过VM内ubuntu IP 无法访问vm内web服务的问题
    C# 使用Nlog记录日志到数据库 使用LogEventInfo类获取,命名空间名称、类名、方法名
    godaddy.com 注册域名 买卖域名
    vue-15-vuex-store的用法
    vue-14-less 语法的使用
    vue-13-swiper组件的使用
  • 原文地址:https://www.cnblogs.com/0xfffffff0/p/10362127.html
Copyright © 2020-2023  润新知