zoukankan      html  css  js  c++  java
  • 《Unix 网络编程》第三章习题

    忙里偷闲,学一学《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的思路,避免代码与协议相关。

  • 相关阅读:
    LNMP编译
    数据库(二)tab补全功能,使数据库支持简体中文,日志管理,备份脚本
    MySQL数据库(一)编译安装、安装后优化操作及超户忘记数据库密码的解决方法
    awk简题
    NFS
    WCF 传递数据量大时的报错处理
    Windows服务工程创建、部署
    反射创建BLL层控制器
    php yii环境简易配置
    php 搭建mvc框架
  • 原文地址:https://www.cnblogs.com/LuoboLiam/p/14642569.html
Copyright © 2011-2022 走看看