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



0 0
原创粉丝点击