Endian.h
封装了字节序转换函数(全局函数,位于muduo::net::sockets名称空间中)。
SocketsOps.h/ SocketsOps.cc
封装了socket相关系统调用(全局函数,位于muduo::net::sockets名称空间中)。
Socket.h/Socket.cc(Socket类)
- 用RAII方法封装套接字文件描述符。
- Sokcet类内部只保存一个套接字文件描述符。
- 提供了常用的套接字相关的操作,例如:绑定套接字,监听,接受一个连接,关闭写操作,获取Tcp信息。
- 设置套接字为NO_DELAY模式,设置地址重用,端口重用,设置keepalive。
InetAddress.h/InetAddress.cc(InetAddress类)
网际地址sockaddr_in封装。
1.Endian类
成员函数:
inline uint64_t hostToNetwork64(uint64_t host64):主机字节序转换为网络字节序,对64位整数进行转换
inline uint32_t hostToNetwork32(uint32_t host32):主机字节序转换为网络字节序,对32位整数进行转换
inline uint16_t hostToNetwork16(uint16_t host16):主机字节序转换为网络字节序,对16位整数进行转换
inline uint64_t networkToHost64(uint64_t net64):网络字节序转换为主机字节序,对64位整数进行转换
inline uint32_t networkToHost32(uint32_t net32):网络字节序转换为主机字节序,对32位整数进行转换
inline uint16_t networkToHost16(uint16_t net16):网络字节序转换为主机字节序,对16位整数进行转换
Endian.h
//封装了字节序转换函数(全局函数,位于muduo::net::sockets名称空间中)
#ifndef MUDUO_NET_ENDIAN_H
#define MUDUO_NET_ENDIAN_H
#include <stdint.h>
#include <endian.h>
namespace muduo
{
namespace net
{
namespace sockets
{
// the inline assembler code makes type blur,
// so we disable warnings for a while.
#if __GNUC_MINOR__ >= 6
#pragma GCC diagnostic push
#endif
#pragma GCC diagnostic ignored "-Wconversion"
#pragma GCC diagnostic ignored "-Wold-style-cast"
//主机字节序转换为网络字节序,对64位整数进行转换
inline uint64_t hostToNetwork64(uint64_t host64)
{
return htobe64(host64);
}
//主机字节序转换为网络字节序,对32位整数进行转换
inline uint32_t hostToNetwork32(uint32_t host32)
{
return htobe32(host32);
}
//主机字节序转换为网络字节序,对16位整数进行转换
inline uint16_t hostToNetwork16(uint16_t host16)
{
return htobe16(host16);
}
//网络字节序转换为主机字节序,对64位整数进行转换
inline uint64_t networkToHost64(uint64_t net64)
{
return be64toh(net64);
}
//网络字节序转换为主机字节序,对32位整数进行转换
inline uint32_t networkToHost32(uint32_t net32)
{
return be32toh(net32);
}
//网络字节序转换为主机字节序,对16位整数进行转换
inline uint16_t networkToHost16(uint16_t net16)
{
return be16toh(net16);
}
#if __GNUC_MINOR__ >= 6
#pragma GCC diagnostic pop
#else
#pragma GCC diagnostic error "-Wconversion"
#pragma GCC diagnostic error "-Wold-style-cast"
#endif
}
}
}
#endif // MUDUO_NET_ENDIAN_H
2.SocketsOps类
成员函数:
int createNonblockingOrDie():创建一个非阻塞的套接字,如果创建失败,则终止程序
int connect(int sockfd, const struct sockaddr_in& addr):连接connect函数
void bindOrDie(int sockfd, const struct sockaddr_in& addr):绑定bind,如果绑定失败,则终止程序
void listenOrDie(int sockfd):监听listen,如果监听失败,则终止程序
int accept(int sockfd, struct sockaddr_in* addr):接受连接accept函数
ssize_t read(int sockfd, void buf, size_t count):从sockfd中读数据到buf
ssize_t readv(int sockfd, const struct iovec iov, int iovcnt):readv与read不同之处在于,接收的数据可以填充到多个缓冲区中
ssize_t write(int sockfd, const void buf, size_t count):将buf中的数据写入到sockfd
void close(int sockfd):关闭文件描述符
void shutdownWrite(int sockfd):关闭连接写的这一半
void toIpPort(char buf, size_t size, const struct sockaddr_in& addr):toIpPort()将地址addr转换为IP与端口的形式
void toIp(char buf, size_t size, const struct sockaddr_in& addr):toIp()被toIpPort()调用,将地址addr转换为点分十进制的IP形式
void fromIpPort(const char ip, uint16_t port, struct sockaddr_in* addr):fromIpPort()从IP和端口构造一个地址addr
int getSocketError(int sockfd):返回sockfd的错误
struct sockaddr_in getLocalAddr(int sockfd):获取sockfd套接字的本地地址
struct sockaddr_in getPeerAddr(int sockfd):获取sockfd套接字的对等方地址
bool isSelfConnect(int sockfd):判断是否是自连接
SocketsOps.h
// This is an internal header file, you should not include this.
//封装了socket相关系统调用(全局函数,位于muduo::net::sockets名称空间中)
#ifndef MUDUO_NET_SOCKETSOPS_H
#define MUDUO_NET_SOCKETSOPS_H
#include <arpa/inet.h>
namespace muduo
{
namespace net
{
namespace sockets
{
///
/// Creates a non-blocking socket file descriptor,
/// abort if any error.
//创建一个非阻塞的套接字,如果创建失败,则终止程序
int createNonblockingOrDie();
//连接connect函数
int connect(int sockfd, const struct sockaddr_in& addr);
//绑定bind,如果绑定失败,则终止程序
void bindOrDie(int sockfd, const struct sockaddr_in& addr);
//监听listen,如果监听失败,则终止程序
void listenOrDie(int sockfd);
//接受连接accept函数
int accept(int sockfd, struct sockaddr_in* addr);
//从sockfd中读数据到buf
ssize_t read(int sockfd, void *buf, size_t count);
//readv与read不同之处在于,接收的数据可以填充到多个缓冲区中
ssize_t readv(int sockfd, const struct iovec *iov, int iovcnt);
//将buf中的数据写入到sockfd
ssize_t write(int sockfd, const void *buf, size_t count);
//关闭文件描述符
void close(int sockfd);
//关闭连接写的这一半
void shutdownWrite(int sockfd);
//toIpPort()将地址addr转换为IP与端口的形式
void toIpPort(char* buf, size_t size,
const struct sockaddr_in& addr);
//toIp()被toIpPort()调用,将地址addr转换为点分十进制的IP形式
void toIp(char* buf, size_t size,
const struct sockaddr_in& addr);
//fromIpPort()从IP和端口构造一个地址addr
void fromIpPort(const char* ip, uint16_t port,
struct sockaddr_in* addr);
//返回sockfd的错误
int getSocketError(int sockfd);
//获取sockfd套接字的本地地址
struct sockaddr_in getLocalAddr(int sockfd);
//获取sockfd套接字的对等方地址
struct sockaddr_in getPeerAddr(int sockfd);
//判断是否是自连接
bool isSelfConnect(int sockfd);
}
}
}
#endif // MUDUO_NET_SOCKETSOPS_H
SocketsOps.cc
#

最低0.47元/天 解锁文章
2692

被折叠的 条评论
为什么被折叠?



