第三章
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题:
运行结果
代码如下
#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;
}