InetAddressC++ 封装 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>

//封装socket地址
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

源码地址

InetAddress.h:https://gitee.com/lpzdinghai/lpzmuduo/blob/master/InetAddress.h

InetAddress.cc:https://gitee.com/lpzdinghai/lpzmuduo/blob/master/InetAddress.cc