作者:用户dvb51bjajs | 来源:互联网 | 2024-12-12 12:33
本文详细解析了muduo库中的Socket封装及字节序转换功能。主要涉及`Endian.h`和`SocketsOps.h`两个头文件,以及`Socket.h`和`InetAddress.h`类的实现。
字节序转换:Endian.h
`Endian.h`文件提供了字节序转换的全局函数,这些函数位于`muduo::net::sockets`命名空间中。字节序转换对于网络通信至关重要,因为不同的系统可能采用不同的字节序(大端或小端)。`Endian.h`中定义了将主机字节序转换为网络字节序(大端)的函数,如`hostToNetwork64`、`hostToNetwork32`和`hostToNetwork16`,以及将网络字节序转换回主机字节序的函数,如`networkToHost64`、`networkToHost32`和`networkToHost16`。这些函数利用了POSIX标准中的`htobe64`、`htobe32`、`htobe16`等函数,但需要注意这些函数在Windows平台上不可用。
Socket操作封装:SocketsOps.h 和 SocketsOps.cc
`SocketsOps.h`文件封装了一系列与socket相关的系统调用,这些函数同样位于`muduo::net::sockets`命名空间中。该文件提供了一系列用于创建、绑定、监听、接受连接、读写数据、关闭socket等操作的函数。例如,`createNonblockingOrDie`函数用于创建一个非阻塞的socket文件描述符,并在创建失败时终止程序。`connect`、`bindOrDie`、`listenOrDie`、`accept`等函数分别用于连接、绑定、监听和接受新的连接。此外,还提供了`read`、`readv`、`write`等读写操作的封装,以及`close`、`shutdownWrite`等关闭操作的封装。
Socket类封装:Socket.h 和 Socket.cc
`Socket.h`文件定义了一个`Socket`类,该类使用RAII(Resource Acquisition Is Initialization)模式封装了socket文件描述符。`Socket`类确保在对象销毁时自动关闭socket文件描述符,从而避免资源泄漏。该类提供了绑定地址、监听、接受连接、关闭写入等操作的方法。例如,`bindAddress`方法用于将socket绑定到指定的本地地址,`listen`方法用于启动监听,`accept`方法用于接受新的连接。此外,还提供了设置TCP选项的方法,如`setTcpNoDelay`用于禁用Nagle算法,`setReuseAddr`用于启用地址重用,`setKeepAlive`用于启用TCP保活机制。
网际地址封装:InetAddress.h 和 InetAddress.cc
`InetAddress.h`文件定义了一个`InetAddress`类,该类封装了`sockaddr_in`结构体,用于表示IPv4地址和端口。`InetAddress`类提供了多种构造函数,包括仅指定端口号(默认绑定到所有可用IP地址)、指定IP地址和端口号、以及从`sockaddr_in`结构体初始化。该类还提供了将地址转换为字符串形式的方法,如`toIp`和`toIpPort`。`InetAddress`类的设计使得在网络编程中处理地址信息更加方便和安全。