《Unix 网络编程》第三章习题

本文介绍了一个名为inet_pton_loose的函数实现细节,该函数能够在特定情况下使用inet_aton来转换IPv4和IPv6地址。对于AF_INET和AF_INET6地址族,当inet_pton返回0时,尝试通过inet_aton进行转换,并针对IPv4映射到IPv6的情况进行了特殊处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

忙里偷闲,学一学《Unix 网络编程》哈哈哈哈哈。

第三章有这样一个练习:

试写一个名为inet_pton_loose的函数,它能处理如下情形:如果地址族为AF_INET且inet_pton返回0,那就调用inet_aton看是否成功;类似地,如果地址族为AF_INET6且inet_pton返回0,那么就调用inet_aton看是否成功,若成功返回其IPv4映射的IPv6地址。

写完之后查了一些答案,感觉都不是我想要的,所以把我的垃圾代码放在这里,期待哪个大佬路过指出问题!

#include <string.h>
#include "unp.h"


int inet_pton_loose(const char *sp, const struct sockaddr *sa) 
{
    if (sa->sa_family == AF_INET) {
        struct sockaddr_in *sin = (struct sockaddr_in *)sa;
        if (inet_pton(AF_INET, sp, &sin->sin_addr) == 0) {
            if (inet_aton(AF_INET, sp, &sin->sin_addr.in_addr) == 1) 
                return (1);
            else 
                return (0);
        } else {
            return (1);
        }
    } else if (sa->sa_family == AF_INET6) {
        struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
        if (inet_pton(AF_INET6, sp, &sin6->sin6_addr) == 0) {
            if (inet_aton(AF_INET6, sp, &sin6->sin6_addr.in6_addr) == 1) {
                char newsp[INET6_ADDRSTRLEN];
                bzero(newsp, sizeof(newsp));
                // 7: sizeof("::FFFF:")
                bcopy(newsp, "::FFFF:", 7); 
                strcat(newsp, sp);
                if (inet_pton(AF_INET6, newsp, &sin6->sin6_addr) == 1) 
                    return (1);
                else
                    return (0);
            }
            else 
                return (0);
        } else {
            return (1);
        }
    }
    return (0);
}

主要参考了书中sock_ntop的思路,避免代码与协议相关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值