ip地址存储

当存储IPv4地址时,建议使用32 位的无符号整数(UNSIGNED INT)来存储,而不是使用字符串。

优点:

1、节省空间,不管是数据存储空间,还是索引存储空间

2、查询时效率更高,便于使用范围查询(Between...And..)

缺点: 

1、需要手动转换,不便于阅读

# Mysql 提供的转换函数
SELECT INET_ATON('192.168.0.1') ipNum;
SELECT INET_NTOA('3232235521') ip;

Java 转换工具类

/**
     * ip String 转成 long 类型数据
     * @param ipStr
     * @return
     */
    public static long ip2Long(String ipStr) {
        String[] ip = ipStr.split("\\.");
        return (Long.valueOf(ip[0]) << 24) + (Long.valueOf(ip[1]) << 16)
                + (Long.valueOf(ip[2]) << 8) + Long.valueOf(ip[3]);
    }

    /**
     * IP  Long 类型数据转换成 String
     * @param ipLong
     * @return
     */
    public static String long2Ip(long ipLong) {
        StringBuilder ip = new StringBuilder();
        ip.append(ipLong >>> 24).append(".");
        ip.append((ipLong >>> 16) & 0xFF).append(".");
        ip.append((ipLong >>> 8) & 0xFF).append(".");
        ip.append(ipLong & 0xFF);
        return ip.toString();
    }

    public static void main(String[] args) {
        System.out.println(ip2Long("192.168.0.1"));
        System.out.println(long2Ip(3232235521L));
    }

### 如何在套接字中存储IP地址 在网络编程中,`struct sockaddr_in` 是用于存储 IPv4 地址和端口的关键数据结构[^1]。该结构体主要包含三个字段:`sin_family` 表示地址家族(通常设置为 `AF_INET`),`sin_port` 存储端口号(需通过 `htons()` 函数将其转换为网络字节序),以及 `sin_addr` 字段用来存储 IP 地址。 #### 数据结构定义 以下是 `struct sockaddr_in` 的典型定义: ```c struct sockaddr_in { sa_family_t sin_family; /* address family: AF_INET */ in_port_t sin_port; /* port in network byte order */ struct in_addr sin_addr; /* internet address */ }; /* Internet address */ struct in_addr { uint32_t s_addr; /* load with inet_aton() or similar function */ }; ``` 为了将 IP 地址存储到套接字中,需要完成以下几个操作: 1. **初始化 `sockaddr_in` 结构体** 需要先创建并初始化一个 `struct sockaddr_in` 变量。例如,可以使用以下代码片段: ```c struct sockaddr_in server_address; memset(&server_address, 0, sizeof(server_address)); // 清零 server_address.sin_family = AF_INET; // 设置地址族为 IPv4 server_address.sin_port = htons(PORT_NUMBER); // 使用 htons 转换端口号 server_address.sin_addr.s_addr = INADDR_ANY; // 接受任意 IP 地址 ``` 2. **绑定地址到套接字** 创建好 `sockaddr_in` 后,可以通过调用 `bind()` 函数将此地址绑定到指定的套接字上。这一步会告诉操作系统哪个本地地址和端口应该与此套接字关联。 ```c int sockfd = socket(AF_INET, SOCK_STREAM, 0); bind(sockfd, (struct sockaddr *)&server_address, sizeof(server_address)); ``` 3. **处理 IP 地址的字符串与二进制互转** 如果需要从字符串形式的 IP 地址(如 `"192.168.1.1"`)转换为适合存储的形式,则需要用到 `inet_pton()` 函数;反之则可以用 `inet_ntop()` 进行反向转换[^3]。 - 将点分十进制字符串转换为网络字节序整数: ```c const char* ip_str = "192.168.1.1"; struct in_addr addr; if (inet_pton(AF_INET, ip_str, &addr) != 1) { perror("Invalid IP"); } ``` - 将网络字节序整数转换回点分十进制字符串: ```c char buffer[INET_ADDRSTRLEN]; if (!inet_ntop(AF_INET, &addr, buffer, INET_ADDRSTRLEN)) { perror("Conversion failed"); } else { printf("Converted IP: %s\n", buffer); } ``` 以上过程展示了如何利用 C/C++ 中的标准库函数,在套接字中正确存储和管理 IP 地址及其相关联的信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值