家政服务公司网站源码,wordpress 怎么安装,wordpress数据库查询数据库名,wordpress 做产品展示本节我们重点来谈论#xff1a; 时间类和我们的初始化链接地址类 文章目录 Timestamp类成员函数实现 InetAddress类具体实现 Timestamp类 
我们为什么要封装一个时间类呢#xff1f; 
这也是一个大型项目必须的基础组建#xff0c;这样我们不仅可以提高代码的可读性#xf…本节我们重点来谈论 时间类和我们的初始化链接地址类 文章目录 Timestamp类成员函数实现 InetAddress类具体实现  Timestamp类 
我们为什么要封装一个时间类呢 
这也是一个大型项目必须的基础组建这样我们不仅可以提高代码的可读性并且封装细节避免了直接操作时间时可能引发的错误提高代码的健壮性。 
//时间类
class Timestamp {
public:Timestamp();explicit Timestamp(int64_t microSecondsSinceEpoch_);//返回当前时间-长整形static Timestamp now();//将长整型转换为年月日字符串std::string toString() const;
private:int64_t microSecondsSinceEpoch_;
};时间类的作用主要就是以上几个 
获取当前时间返回值是一个长整型长整型转换为年月日 
调用方式应为 
int main () {cout  Timestamp::now().toString()  endlreturn 0;
}成员函数实现 
#include Timestamp.h#include time.hTimestamp::Timestamp(): microSecondsSinceEpoch_(0) {}Timestamp::Timestamp(int64_t microSecondsSinceEpoch): microSecondsSinceEpoch_(microSecondsSinceEpoch){}Timestamp Timestamp::now()
{//返回对象实例对象成员变量是当前的 int64_treturn Timestamp(time(NULL));
}std::string Timestamp::toString() const
{char buf[128]  { 0 };tm *tm_time  localtime(microSecondsSinceEpoch_);snprintf(buf, 128, %4d/%02d/%02d %02d:%02d:%02d, tm_time-tm_year  1900, tm_time-tm_mon  1,tm_time-tm_mday,tm_time-tm_hour,tm_time-tm_min,tm_time-tm_sec);return buf;
}time(NULL)返回一个 64 位整数是自 Unix 纪元1970 年 1 月 1 日 00:00:00 UTC以来的时间变量类型为int64_t 
InetAddress类 
该类也比较简单就是封装 socket 地址的类型 
class InetAddress {
public:explicit InetAddress(uint16_t port, std::string ip  127.0.0.1);explicit InetAddress(const sockaddr_in addr): addr_(addr){}std::string toIP() const;std::string toIpPort() const;uint16_t toPort() const;const sockaddr_in* getSockAddr() const {return addr_;}private:sockaddr_in addr_;
};toIP()返回 InetAddress 对象中存储的 IP 地址的字符串表示toIpPort()返回 InetAddress 对象中存储的 IP 地址和端口号的字符串表示格式为 IP:PorttoPort()返回 InetAddress 对象中存储的端口号。getSockAddr()返回指向内部 sockaddr_in 结构体的指针方便在其他网络操作中使用。私有成员变量 sockaddr_in addr_存储 IP 地址和端口号的结构体包含了网络地址信息。 
该类的主要作用就是 
提供对 IP 地址和端口号的封装便于在网络编程中管理和使用提供方便的方法来获取和表示网络地址和端口的信息通过提供的函数能够轻松地转换地址和端口信息为字符串格式便于调试和日志记录。 
具体实现 
InetAddress::InetAddress(uint16_t port, std::string ip) {bzero(addr_, sizeof addr_);addr_.sin_family  AF_INET;addr_.sin_port  htons(port);addr_.sin_addr.s_addr  inet_addr(ip.c_str());
}std::string InetAddress::toIP() const
{//addr_char buf[64]  {0};::inet_ntop(AF_INET, addr_.sin_addr, buf, sizeof buf);return buf;
}std::string InetAddress::toIpPort() const
{//ip: portchar buf[64]  {0};::inet_ntop(AF_INET, addr_.sin_addr, buf, sizeof buf);size_t end  strlen(buf);uint16_t port  ntohs(addr_.sin_port);sprintf(bufend, :%u, port);return buf;
}uint16_t InetAddress::toPort() const
{return ntohs(addr_.sin_port);
}我们可以看出构造函数已经为我们封装好了sockaddr_in的配置我们只需要传入ip和port即可 
然后这里主要解释几个函数 
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);inet_ntop(AF_INET, addr_.sin_addr, buf, sizeof buf);inet_ntop 是一个用于将网络地址转换为字符串表示的函数. 
af地址族通常为 AF_INET表示 IPv4或 AF_INET6表示 IPv6。 src指向存储有IP的结构体。 dst指向用于存储转换后的字符串的缓冲区。 size缓冲区的大小。 
int sprintf(char *str, const char *format, ...);sprintf(buf  end, :%u, port);sprintf 是一个 C 标准库函数用于将格式化的数据写入字符串中。 
这里的bufend其实就是接着之前写进去的ip后面继续写port端口。