UNP 学习笔记 第三章

第三章

1.地址结构

1. IPv4/IPv6/外加两个通用地址结构
2. 复习结构体的对齐

2.网络字节序

1. 复习大小端
2. 4个大小端转换函数

3.值-结果参数是什么

4.字节操纵函数

1. 书上给出的3个BSD版本的常用api,必会
2. ANSI C书上给出的3个,包括源码,必会
3.[c标准库,string.h里的这些所有都要会]
4. STL里的copy()算法 && 做对比,感受从具体类型移植为泛型

(https://blog.csdn.net/liuqiyao_01/article/details/26967813?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160541613119724839201250%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=160541613119724839201250&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-15-26967813.first_rank_ecpm_v3_pc_rank_v2&utm_term=memcmp%E6%BA%90%E4%BB%A3%E7%A0%81&spm=1018.2118.3001.4449)

5.地址和表达式转换

1. 两个协议无关api必会.
2. 其他了解会用即可.

6.协议无关的代码

可以通过包装函数,编写协议无关的代码.如: sock_ntop,简单了解这个函数

7.初步了解IO函数

1. readn,writen,readline,必会.
	先自己挨个实现,挨个测试,再对照标准实现,不硬背.
2. 结合C++Prime等,再次复习底层const和顶层const .这里经常弄混.
3. 结合csapp,实现带缓冲的IO函数.

8.课后习题

1,2题省略.

第3题:

运行结果

上面为ipv4,下面为ipv4映射的ipv6

代码如下

#include <stdio.h>  
#include <stdlib.h>  
#include <arpa/inet.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <string.h>  


/** 
有所参考,稍微改动,详细注释
**/   
int  
inet_pton_loose(int family,const char *strptr,void *addrptr)  
{     
    if(inet_pton(family,strptr,addrptr) == 0){  //可以调用inet成功
        struct in_addr  v4addr;		// 首先判断是否是IPv4,这是所需的结构  
        if(inet_aton(strptr,&v4addr)    == 1){  //可以转换
            if(family == AF_INET){  //IPv4
				//既然可以转换,那么直接将IPv4的地址复制过来即可
                memcpy(addrptr,(void *)&v4addr,sizeof(struct in_addr));   
                return 1;  
            }  
            if(family == AF_INET6){  //现在判断是IPv6的情况
                struct in6_addr v6addr;  
				int i = 0;    //接下来将IPv4转换为IPv6
                for(i=0;i<16;i++){  //ipv6共16B,128bit,对每个Byte挨个处理
                    if(i<10)  //前10位为0
                        v6addr.s6_addr[i] = 0;  
                    if(i >= 10 && i < 12)	//如下  
                        v6addr.s6_addr[i] = 0xf;  
                    if(i >= 12 )  //最后4位
                        v6addr.s6_addr[i] = htonl(v4addr.s_addr)>>(16-i-1)*8;  
                }  
                //复制到最终结果里来
                memcpy(addrptr,(void *)&v6addr,sizeof(struct in6_addr));  
                return 1;                             
            }     
        }  
        return 0;	// inet_aton转换失败  
    }         
    return 1;  
}  
//获取输入,辨别是IPv4 还是IPv6 并做相应的处,理完成后输出用户的输入。没有添加错误处理。 
int  
main(int argc,char **argv)  
{  
    struct in_addr IPv4addr;  
    struct in6_addr IPv6addr;  

    const u_char *strptr;  
    const char *AddrFlag4 = "AF_INET";  
    const char *AddrFlag6 = "AF_INET6";  

    if(strcmp(AddrFlag4,argv[1]) == 0){  

        if(inet_pton_loose(AF_INET,argv[2],(void *)&IPv4addr) == 1){  
            strptr = (u_char *)&IPv4addr;  
            printf("%s---%d.%d.%d.%d\n",argv[1],strptr[0],strptr[1],strptr[2],strptr[3]);  
            return 1;  
        }  
    }  
    if(strcmp(AddrFlag6,argv[1]) == 0){  
        if(inet_pton_loose(AF_INET6,argv[2],(void *)&IPv6addr)  == 1){  
            strptr = (u_char *)&IPv6addr;  
            printf("%s---%d%d:%d%d:%d%d:%d%d:%d%d:%x%x:%d.%d.%d.%d\n",argv[1],strptr[0],strptr[1],                  strptr[2],strptr[3],strptr[4],strptr[5],strptr[6],strptr[7],strptr[8],strptr[9]  
             ,strptr[10],strptr[11],strptr[12],strptr[13],strptr[14],strptr[15]);  
            return 1;  
        }  
    }  
    return 1;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值