这段代码定义了一个 InetAddress
类,是 C++ 网络编程中用于封装 IPv4 地址和端口的常见做法。该类的主要作用是方便地表示和操作一个网络地址(IP + 端口)
class InetAddress { public: explicit InetAddress(uint16_t port=0,std::string ip="127.0.0.1"); //使用指定的 ip 和 port 创建一个地址对象,默认是 127.0.0.1:0 //允许通过已有的 sockaddr_in 结构体直接构造 InetAddress 对象 explicit InetAddress(const sockaddr_in &addr):addr_(addr) {} std::string toIp()const;//将 addr_ 中的 IP 地址转为字符串,例如 "192.168.1.1" std::string toIpPort()const;//返回 "IP:Port" 格式的字符串,例如 "192.168.1.1:8080"。 uint16_t toPort()const;//返回端口号(从网络字节序转换为主机字节序)。 const sockaddr_in* getSockAddr()const { return &addr_;//获取原始 sockaddr_in 指针,便于与 bind(), connect() 等系统调用接口对接 } void setSockAddr(const sockaddr_in &addr ){addr_=addr;}//设置内部地址,通常用于接受连接后的地址填充 private: sockaddr_in addr_;//表示一个 IPv4 网络地址,包含 IP 地址和端口 };
函数实现
InetAddress::InetAddress(uint16_t port,std::string ip) { bzero(&addr_,sizeof addr_);//清零结构体内存 addr_.sin_family=AF_INET;//将地址族设置为 AF_INET,表示使用 IPv4 地址 addr_.sin_port=htons(port);//将主机字节序转换为网络字节序,并赋值给 sin_port。这是因为网络传输中使用的是大端字节序。 addr_.sin_addr.s_addr=inet_addr(ip.c_str());/// 将 IP 字符串转为网络字节序的整型地址 } std::string InetAddress::toIp()const// 将二进制 IP 转换为字符串: { //addr char buf[64]={0};// // 分配缓冲区存放最终 "IP:端口" 字符串 inet_ntop(AF_INET,&addr_.sin_addr,buf,sizeof buf);// 把二进制的 IP 地址转换为字符串形式,写入 buf return buf; } std::string InetAddress::toIpPort()const// 返回完整的地址字符串,如 "127.0.0.1:8080"。 { //ip::port char buf[64]={0}; inet_ntop(AF_INET,&addr_.sin_addr,buf,sizeof buf);// 将二进制 IP 转换为字符串: size_t end=strlen(buf); // 获取 IP 字符串的长度,作为端口拼接的起点 uint16_t port=ntohs(addr_.sin_port);//获取主机字节序的端口号(用 ntohs 由网络字节序转回来)。 sprintf(buf+end,":%u",port);// // 在 buf 的末尾继续拼接 ":端口" 字符串 return buf; } uint16_t InetAddress::toPort()const { return ntohs(addr_.sin_port);// // 将网络字节序的端口号转换为主机字节序并返回 }