inet_addr 函数 和 inet_ntoa 函数 自实现

本文介绍了两个用于IP地址转换的C语言函数实现:一个将点分十进制字符串转换为32位整数形式的IP地址,另一个则完成相反的过程,即将32位整数形式的IP地址转换回点分十进制字符串形式。

/* inet_addr 函数 */

#include <stdio.h>


long change_uint(long a, long b, long c, long d){
    long address = 0;
    address |= d<<24;
    address |= c<<16;
    address |= b<<8;
    address |= a;
    return address;
}
long change_addr(const char *str){
    long a, b, c, d;
    sscanf(str, "%ld.%ld.%ld.%ld", &a, &b, &c, &d);
    return change_uint(a, b, c, d);
}

int main(int argc, char* argv[]){
    long addr;
    addr = change_addr("192.168.0.1");

    printf("%ld\n", addr);

    return 0;

}



/* inet_ntoa 函数 */

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


char *my_inet_ntoa(unsigned long);


char str[30];
int main(int argc,char **argv)
{
unsigned long inaddr=3232235777;
printf("%s\n",my_inet_ntoa(inaddr));
return 0;
}


char *my_inet_ntoa(unsigned long inaddr)
{
    int a[4],i;
    char b[20],c[15],d[10],e[5];
    a[0]=((inaddr & 0xff000000)>>24);
    a[1]=((inaddr & 0x00ff0000)>>16);
    a[2]=((inaddr & 0x0000ff00)>>8);
    a[3]=((inaddr & 0x000000ff)>>0);
    
//    itoa(a[0],b,10);
    sprintf(b,"%d",a[0]);
    strcat(b,".");
    printf("%c %c %c \n", b[0], b[1], b[2]);
//    itoa(a[1],c,10);
    sprintf(c,"%d",a[1]);
    strcat(c,".");
//    itoa(a[2],d,10);
    sprintf(d,"%d",a[2]);
    strcat(d,".");
//    itoa(a[3],e,10);
    sprintf(e,"%d",a[3]);
        
    strcat(str,strcat(b,strcat(c,strcat(d,e))));
    return str;
    
}




<think>首先,用户的问题是:“我想了解C语言中inet_addr函数的作用”。用户指定了参考站内引用,所以我必须参考这些引用来回答问题。引用包括[1]、[2]、[3][4]。 从引用[1]引用[2]中,我可以提取关于inet_addr函数的信息: - inet_addr函数用于将点分十进制格式的IPv4地址字符串转换为32位的网络字节序二进制值。 - 例如,"192.168.1.1"这样的字符串会被转换成一个32位的整数。 - 在引用[2]中,它详细说明了函数原型:in_addr_t inet_addr(const char *string); - 它还提到,如果输入无效的IP地址(如大于255的部分),函数会返回INADDR_NONE(通常是-1)。 - 相比之下,inet_aton函数更推荐使用,因为它可以正确处理所有情况,包括"255.255.255.255",并且错误处理更清晰。 引用[3]讨论了inet_addr的问题: - 它提到,inet_addr函数在判断IP地址是否合法时存在问题,因为它可能无法正确处理某些边界情况,比如255.255.255.255(因为返回-1可能与错误值冲突)。 - 用户提到,以前以为inet_addr可以判断IP合法性,但实际存在问题。 引用[4]提供了一个实例,但主要是关于inet_atoninet_ntoa函数功能。 用户上一次的问题是询问inet_addr的作用,所以我需要聚焦于inet_addr的作用。 系统级指令要求: - 所有行内数学表达式使用$...$格式(例如,变量或方程)。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^数字]。 - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 在回答中: - 解释inet_addr函数的作用。 - 参考给定的引用。 - 结构清晰:先定义函数的作用,然后给出细节。 - 结束时生成相关问题。 关键点从引用中总结: - 作用:将点分十进制IPv4地址字符串转换为32位网络字节序二进制值。 - 函数原型:in_addr_t inet_addr(const char *string); - 返回值:成功返回网络字节序的32位整数;失败返回INADDR_NONE。 - 问题:无法正确处理"255.255.255.255",因为它返回-1,与错误值相同;因此不推荐使用,inet_aton更好。 - 安全性推荐:inet_addr被认为过时,inet_aton更安全。 我的回答应该: 1. 开头直接回答用户问题:解释inet_addr函数的作用。 2. 提供细节:函数原型、返回值、使用注意事项。 3. 引用参考:在相关部分添加引用标识。 4. 使用中文。 5. 结束时生成相关问题。 生成相关问题: - 基于主题:函数的使用、替代方案、错误处理等。 - 例如: 1. inet_addrinet_aton的区别是什么? 2. 如何正确处理IP地址转换中的错误? 3. 为什么inet_addr不推荐使用? 确保LaTeX格式: - 在这个上下文中,可能没有数学表达式,但如果有变量如IP地址,可以用$...$包裹,例如$192.168.1.1$。 - 独立公式可能不需要。 完整回答结构: - 引言:简要定义函数作用。 - 详细解释:包括函数原型、返回值、示例(如果需要)。 - 注意事项:基于引用说明问题。 - 结尾:生成相关问题。 </think>### C语言中inet_addr函数的作用 在C语言网络编程中,`inet_addr`函数是一个用于处理IPv4地址的核心函数。其主要作用是将点分十进制格式的IPv4地址字符串(如$192.168.1.1$)转换为32位的网络字节序二进制值(即`in_addr_t`类型)。网络字节序(大端序)是网络协议中使用的标准字节顺序,确保不同系统间的数据兼容性。下面我将逐步解释其细节使用注意事项,帮助您全面理解。 #### 1. **函数定义原型** - 函数原型:`in_addr_t inet_addr(const char *string);` - 参数`string`:输入的点分十进制IPv4地址字符串,例如$192.168.1.1$。 - 返回值:成功时返回一个32位网络字节序整数值(类型为`in_addr_t`);失败时返回`INADDR_NONE`(通常表示为$-1$)。 - **作用机制**:该函数解析输入的字符串,将每个点分部分(如$192$、$168$等)转换为字节,并组合成一个32位整数。例如,$192.168.1.1$会被转换为类似$0xC0A80101$的二进制值[^2]。 #### 2. **使用示例代码说明** 引用[1]提供了一个简单示例,展示了如何使用`inet_addr`函数: ```c #include <stdio.h> #include <arpa/inet.h> int main() { char *ip = "192.168.1.1"; in_addr_t addr = inet_addr(ip); // 调用inet_addr转换地址 if (addr == INADDR_NONE) { // 错误检查 perror("inet_addr"); return 1; } printf("IP地址的整数值为: %u\n", addr); return 0; } ``` - 在这个例子中: - 输入字符串$192.168.1.1$被转换为32位二进制值。 - 如果字符串无效(如包含超出$0$到$255$范围的数字),函数返回`INADDR_NONE`,并通过`perror`输出错误信息[^1][^2]。 - **注意事项**:转换后的值是网络字节序,适用于Socket编程中的地址设置(如传递给`bind()`或`connect()`函数)。 #### 3. **潜在问题限制** - **错误处理缺陷**:`inet_addr`在无效输入时返回`INADDR_NONE`($-1$),但这与某些合法IP地址冲突。例如,$255.255.255.255$(广播地址)也会返回$-1$,导致无法区分错误合法值[^2][^3]。这可能在IP合法性检查中引入Bug。 - **安全性过时性**:由于上述问题,`inet_addr`被认为不推荐使用(已过时)。更安全的替代函数是`inet_aton`,它通过结构体输出结果,并提供清晰的错误处理(成功返回$1$,失败返回$0$)[^2][^3]。 - **边界情况处理**:对于字符串格式错误(如多余点号或非数字字符),`inet_addr`可能返回不可靠结果,因此在生产代码中建议使用`inet_aton`或现代替代方案[^3]。 #### 4. **与替代函数的比较** - **inet_addr vs. inet_aton**: - `inet_addr`直接返回整数值,但错误处理受限。 - `inet_aton`使用结构体参数(`struct in_addr *addr`),能正确处理所有IP地址(包括$255.255.255.255$),错误时返回$0$[^2]。 - 示例:`inet_aton(ip, &addr)`更可靠,尤其在高安全性应用中[^2][^4]。 - **推荐实践**:在C语言项目中使用`inet_pton`(IPv6兼容)或`inet_aton`以避免`inet_addr`的缺陷[^3]。 总之,`inet_addr`函数主要用于将人类可读的IP地址字符串转换为网络字节序二进制值,但其错误处理问题使其在当代编程中逐渐被弃用。优先考虑使用更健壮的替代方案[^1][^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值