Rust in Action笔记 第八章 网络

  1. P253的图展示了网络各层用到的协议在这里插入图片描述
  2. Box<dyn std::error::Error>表示一个指针指向的实现了标准错误库的类型,dyn表明这是一个特征对象(trait object),是rust里多态的一种实现方式;
  3. 特征对象和模板对象(generics)都是rust实现多态的方式,模板属于静态分发(static dispatch),需要更多的磁盘空间(disk space),但是更快(faster funtime);特征对象(trait object)属于动态分发(dynamic dispatch),运行时需要的空间更小但会引入一点运行时的开销(间接指针的寻址开销);
  4. 在rust里特征对象有三种形式,&dyn Trait, &mut dyn Trait, Box<dyn Trait>,主要区别是Box<dyn Trait>是有所有权的对象(owned trait object),另外两种是借用(borrowed)的,旧版本中还有&Trait, Box<Trait>表示特征对象,现在已经弃用,在函数返回值封装错误成Box<dyn Trait>的原因是Box的大小已知,可以存放在栈上;
  5. 8.3节后面大部分通过一个简单的RPG游戏来介绍特征对象;
  6. 8.4节讲了如何使用标准库中std::net::TcpStream来创建tcp连接,以及使用trust_dns库来解析域名;通常绑定本地地址为0.0.0.0:0,表示在本机由OS挑选一个随机的端口来创建连接;
  7. 使用Vec::with_capacity(512)vec![0;512]来创建Vec<T>的区别在于前者的长度为0,容量为512,后者的长度和容量都是512;
  8. 问号?在一个返回Result<T,E>的函数结尾是一个语法糖,作为try!宏的缩写形式,当返回结果是Ok(T)的时候返回T,返回Err(err)的时候,try! / ?提前返回并且尝试将err转化成调用函数返回值的Error类型;
  9. 为一个新的类型实现std::error::Error可以在实现部分留空,因为在std::error::Error里有默认实现,map_err(f)中会把一个error类型映射(map)到一个函数(function)中,在这里一个实现了std::error::Error的枚举错误类型可以看做是一个function;
  10. 如果不想使用map_err(),可以为自己的Error类型实现std::convert::From来减少过于冗长的代码;还有一种应对多种Error类型返回值的方法就是使用unwrap()或者expect(),但这种方法不推荐给库作者,因为使用库的用户可能会碰到意想不到崩溃;
  11. MAC地址有6个字节,分为全球地址(universally administered address)和局域地址(locally administered address),全球地址在MAC地址的前3个字节里,表示组织编号,而局域地址的6个字节都是设备编号;
  12. MAC地址有单播(unicast)和广播(multicast)两种模式,区别在于单播只会让目标MAC地址收到数据帧(frame),设置方法是在MAC地址第一个字节的最低位,设为1表示广播模式,下图比较清晰的阐释了两种模式的区别:图8.4
  13. 8.9节介绍了用ip tuntap工具来创建虚拟网络设备,必须在Linux环境下运行,详见Page282;8.10节从命令行参数处理、MAC地址生成、DNS解析、用TCP原语发起HTTP请求,实现了一个比较底层的网络处理工具;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值