0%

endpoint

Asio asio::ip::tcp::endpoint 是什么

Asio(或 Boost.Asio)中,asio::ip::tcp::endpoint 是一个类,表示一个 TCP 端点。它包含了 IP 地址和端口号,用于描述 TCP 网络通信中的目标或源。

作用

asio::ip::tcp::endpoint 是 TCP 套接字(asio::ip::tcp::socket)操作中的核心组件,用来:

  1. 指定服务器的地址和端口,作为客户端的目标。
  2. 指定本地地址和端口,用于绑定监听服务器或设置客户端绑定信息。
  3. 在连接建立后获取对等端的网络信息(如对端 IP 和端口)。

类定义

asio::ip::tcp::endpointasio::ip::basic_endpoint<tcp> 的具体实现,用于 TCP 协议。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
namespace asio {
namespace ip {
class tcp::endpoint {
public:
// 构造函数
endpoint(); // 默认构造,地址为 unspecified,端口为 0
endpoint(const address& addr, unsigned short port); // 使用地址和端口初始化

// 设置/获取地址
void address(const address& addr);
address address() const;

// 设置/获取端口
void port(unsigned short port);
unsigned short port() const;

// 比较运算符
bool operator==(const endpoint& other) const;
bool operator!=(const endpoint& other) const;

// 其他函数
std::string to_string() const; // 返回可读的字符串表示
};
}
}

常见操作

1. 创建端点

1
2
asio::ip::address addr = asio::ip::make_address("127.0.0.1");
asio::ip::tcp::endpoint endpoint(addr, 8080);

这表示一个 TCP 端点,IP 地址是 127.0.0.1,端口号是 8080

2. 默认构造

1
asio::ip::tcp::endpoint endpoint;

创建一个默认的端点,地址为 0.0.0.0(未指定地址),端口为 0

3. 动态绑定(服务器)

当服务器需要绑定一个本地端口时,可以使用:

1
2
3
4
5
asio::ip::tcp::acceptor acceptor(io_context);
asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), 8080);
acceptor.open(endpoint.protocol());
acceptor.bind(endpoint);
acceptor.listen();

此处,endpoint 表示监听在 IPv4 地址的所有网络接口(0.0.0.0)上的端口 8080

4. 解析客户端或服务器端地址

  • 客户端连接时,解析服务器端点:
    1
    2
    asio::ip::tcp::resolver resolver(io_context);
    auto endpoints = resolver.resolve("example.com", "80");
  • 在服务器端,从已接受的连接中获取对端的 IP 和端口:
    1
    2
    3
    4
    5
    asio::ip::tcp::socket socket(io_context);
    acceptor.accept(socket);
    asio::ip::tcp::endpoint remote_endpoint = socket.remote_endpoint();
    std::cout << "Connected to " << remote_endpoint.address().to_string()
    << ":" << remote_endpoint.port() << std::endl;

5. 转换为字符串

1
2
asio::ip::tcp::endpoint endpoint(asio::ip::make_address("192.168.1.1"), 12345);
std::cout << "Endpoint: " << endpoint.to_string() << std::endl;

输出:

1
Endpoint: 192.168.1.1:12345

重要成员函数

构造函数

  1. 默认构造

    • 创建一个未指定地址和端口的端点(0.0.0.0:0[::]:0)。
      1
      asio::ip::tcp::endpoint();
  2. 地址和端口构造

    • 使用指定的 asio::ip::address 和端口初始化。
      1
      asio::ip::tcp::endpoint(const asio::ip::address& addr, unsigned short port);
  3. 协议构造

    • 使用协议(IPv4/IPv6)和端口初始化,地址为未指定。
      1
      asio::ip::tcp::endpoint(asio::ip::tcp::v4(), 8080);

成员函数

  1. 设置地址

    1
    void address(const asio::ip::address& addr);

    修改端点的 IP 地址。

  2. 获取地址

    1
    asio::ip::address address() const;

    返回端点的 IP 地址。

  3. 设置端口

    1
    void port(unsigned short port);

    修改端点的端口号。

  4. 获取端口

    1
    unsigned short port() const;

    返回端点的端口号。

  5. 转换为字符串

    1
    std::string to_string() const;

    返回端点的字符串表示形式,例如 127.0.0.1:8080


典型用例

客户端

1
2
3
4
5
asio::io_context io_context;
tcp::resolver resolver(io_context);
auto endpoints = resolver.resolve("127.0.0.1", "8080");
tcp::socket socket(io_context);
asio::connect(socket, endpoints);

服务器

1
2
3
4
5
6
7
asio::io_context io_context;
tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 8080));
tcp::socket socket(io_context);
acceptor.accept(socket);

tcp::endpoint remote_endpoint = socket.remote_endpoint();
std::cout << "Connected from " << remote_endpoint.to_string() << std::endl;

总结

asio::ip::tcp::endpoint 是 TCP 通信中的一个核心组件,用于描述通信双方的网络位置。它不仅简单易用,而且与其他 Asio 组件(如 tcp::resolvertcp::socket)紧密配合,为构建高效的网络程序提供了强大支持。

感谢老板支持!敬礼(^^ゞ