InetAddress是C++ 封装 socket 网络地址的核心类,用于统一管理 sockaddr_in 结构体(IPv4 地址 + 端口),屏蔽底层系统调用细节。
InetAddress.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #pragma once
#include <string> #include <arpa/inet.h> #include <netinet/in.h>
class InetAddress { public: explicit InetAddress(uint16_t port = 0, std::string ip = "0.0.0.0"); 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_; } void setSockAddr(const sockaddr_in& addr) { addr_ = addr; }
private: sockaddr_in addr_; };
|
构造函数,IP 地址,默认 0.0.0.0(代表本机所有网卡),explicit禁止隐式转换。
InetAddress.cc
1 2 3 4 5 6 7 8 9 10
| InetAddress::InetAddress(uint16_t port, std::string ip) { memset(&addr_, 0, sizeof(addr_)); addr_.sin_family = AF_INET; addr_.sin_port = htons(port); if(inet_pton(AF_INET, ip.c_str(), &addr_.sin_addr) <= 0) { LOG_ERROR("IP inet_pton failed, ip: {}", ip); } }
|
构造函数,将传入的端口(port)、地址(ip)写入成员addr_。
inet_pton()第二个参数是char*类型,所以传入的string要用c_str()转化为c字符串。
1 2 3 4 5 6
| std::string InetAddress::toIp() const { char buf[64] = { 0 }; ::inet_ntop(AF_INET, &addr_.sin_addr, buf, sizeof buf); return buf; }
|
网络IP转字符串,返回类似 "192.168.1.100" 的字符串。
1 2 3 4 5 6 7 8 9
| std::string InetAddress::toIpPort() const { char 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); snprintf(buf + end, sizeof(buf) - end, ":%u", port); return buf; }
|
先取出IP,再从IP字符串后面拼接端口,返回 "192.168.1.100:8080" 格式字符串。
1 2 3 4
| uint16_t InetAddress::toPort() const { return ::ntohs(addr_.sin_port); }
|
端口转字节序,返回 8080 这类端口号。
::表示调用全局作用域的函数,避免和类成员函数重名冲突。
测试代码
1 2 3 4 5 6 7 8
| #include "InetAddress.h" #include <iostream>
int main() { InetAddress addr(8080, "127.0.0.1"); std::cout<<addr.toIpPort()<<std::endl; }
|

源码地址
InetAddress.h:https://gitee.com/lpzdinghai/lpzmuduo/blob/master/InetAddress.h
InetAddress.cc:https://gitee.com/lpzdinghai/lpzmuduo/blob/master/InetAddress.cc