muduo库的学习2--Socket的基本设计---代码细节
来源:互联网 发布:it 网络管理系统 价格 编辑:程序博客网 时间:2024/05/18 01:03
SocketsOps文件
1.作用
封装了,像socket,connect,bind,accept,listen,read,write,close,以及一些地址转换的函数。
加入了出错控制信息,并且定义的操作均为非阻塞的。
并且同意控制在一个muduo::net::sockets的命名空间之下。
2.细节
(1)关于VALGRIND以及NO_ACCEPT4这两个宏,
它们在C++标准库里面是没有的,我用grep -nr XXXX ...../muduo
在muduo库的整个范围内搜索,发现只是在CMAKELIST里面有注释掉的宏定义。
其功能就是判断系统内核,直接创建带有非阻塞功能的套接字,以及accept函数。
这些要求在内核版本2.6.27以后便能直接办到,而在github上面,README又说muduo库适用于版本2.6.28及以后版本。
所以此宏定义下的代码实际上是无用的,完全可以忽略。
(2)关于类型转换static_cast与implicit_cast
①为什么要用implicit_cast
static_cast不能用于交叉转换,也就是说只能父类到子类,或者子类到父类,不能子类到子类。
而父类到子类又叫向下转换,子类到父类又叫向上转换。
一般向下转换,只是开发的时候用于类型检查,向上转换是允许的。
但是static_cast向上或者向下转换在编译的时候都不会出错,而向下转换在运行时出错。
所以就要用到只能向上转换的implicit_cast,如果出现向下转换它在编译的时候就会报错。
②为什么指针要进行2次转换
而指针可以看做地址与长度的描述,指针本身表示的是地址,而其类型指明了长度。
而void*,只能指明地址,无法指明长度,这样其实可以看做其他指针的父类。
如果要实现一般指针之间的转换,相当于交叉转换,不能成功,这个时候可以先子类A到父类,再父类到子类B进行转换。
(3)socket编程的两类地址
①表示不同的套接字的sockaddr_xxx
IPv4---sockaddr_in in表示internet
IPv6---sockaddr_in6 in6表示IPv6
Unix---sockaddr_un un表示UNIX
此种套接字适合程序员填入合适的参数(协议类型,端口号,IP地址)
②套接字函数为了统一处理不同套接字使用的sockaddr
具体的处理方法就是:使用一个比任何套接字类型都大的作为参数,先让小的转换为大的,然后再传入小的的具体size。
这里确实是一种向下转换的方式,但是由于size的具体限制,不会访问到不可访问的内存。
其在C语言里面的实现方法是C的指针强制类型转换。
而如果当时就有void*的话,便无需单独创建一个结构体sockaddr。
不过现在我们使用C++的强制类型转换,必须要借助于void*。
此种地址适合调用套接字函数(bind,connect,accept)的时候使用
为了编码方便常常typedef struct sockaddr SA
- muduo库的学习2--Socket的基本设计---代码细节
- muduo库的学习1---socket基本设计---总论
- muduo库的学习4---loop的基本设计---EventLoop细节
- muduo库的学习5---loop的基本设计---Channel细节
- muduo库的学习6---Buffer的基本设计
- muduo库的学习3---loop基本设计---总论
- muduo库的Socket封装
- muduo库的学习7---TcpServer与TcpClient的基本设计---总论
- muduo库的学习8---TcpServer与TcpClient的基本设计---TcpServer
- muduo库的学习10---TcpServer与TcpClient的基本设计---TcpConnection建立与关闭
- muduo库的学习11---TcpServer与TcpClient的基本设计---TcpConnection接收与发送
- muduo库的学习9---TcpServer与TcpClient的基本设计---TcpConnection成员
- muduo网络库学习(三)定时器TimerQueue的设计
- 学习muduo(框架的设计)
- muduo网络库中buffer的设计
- muduo网络库中buffer的设计
- muduo中buffer的设计
- muduo库的学习0---总论
- jQuery之#id选择器
- Batch File Redirection
- C++11之function和bind
- 程序员面试技巧
- shell编程注意事项
- muduo库的学习2--Socket的基本设计---代码细节
- 制作initrd(6):重做Ubuntu安装盘
- MatLab基础
- iOS 创建单例的两种方法
- fcntl函数详解
- Leetcode旅途三
- 线性最小二乘法
- Missing iOS Distribution signing identity for ...
- 51nod 1443 路径和树