net6. 套接字封装类——Endian、SocketsOps、Socket、InetAddress

Endian.h
封装了字节序转换函数(全局函数,位于muduo::net::sockets名称空间中)。

SocketsOps.h/ SocketsOps.cc
封装了socket相关系统调用(全局函数,位于muduo::net::sockets名称空间中)。

Socket.h/Socket.cc(Socket类)

  1. 用RAII方法封装套接字文件描述符。
  2. Sokcet类内部只保存一个套接字文件描述符。
  3. 提供了常用的套接字相关的操作,例如:绑定套接字,监听,接受一个连接,关闭写操作,获取Tcp信息。
  4. 设置套接字为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

#
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值