Asio asio::ip::tcp::endpoint 是什么
在 Asio(或 Boost.Asio)中,asio::ip::tcp::endpoint
是一个类,表示一个 TCP 端点。它包含了 IP 地址和端口号,用于描述 TCP 网络通信中的目标或源。
作用
asio::ip::tcp::endpoint
是 TCP 套接字(asio::ip::tcp::socket
)操作中的核心组件,用来:
- 指定服务器的地址和端口,作为客户端的目标。
- 指定本地地址和端口,用于绑定监听服务器或设置客户端绑定信息。
- 在连接建立后获取对等端的网络信息(如对端 IP 和端口)。
类定义
asio::ip::tcp::endpoint
是 asio::ip::basic_endpoint<tcp>
的具体实现,用于 TCP 协议。
1 | namespace asio { |
常见操作
1. 创建端点
1 | asio::ip::address addr = asio::ip::make_address("127.0.0.1"); |
这表示一个 TCP 端点,IP 地址是 127.0.0.1
,端口号是 8080
。
2. 默认构造
1 | asio::ip::tcp::endpoint endpoint; |
创建一个默认的端点,地址为 0.0.0.0
(未指定地址),端口为 0
。
3. 动态绑定(服务器)
当服务器需要绑定一个本地端口时,可以使用:
1 | asio::ip::tcp::acceptor acceptor(io_context); |
此处,endpoint
表示监听在 IPv4 地址的所有网络接口(0.0.0.0
)上的端口 8080
。
4. 解析客户端或服务器端地址
- 客户端连接时,解析服务器端点:
1
2asio::ip::tcp::resolver resolver(io_context);
auto endpoints = resolver.resolve("example.com", "80"); - 在服务器端,从已接受的连接中获取对端的 IP 和端口:
1
2
3
4
5asio::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 | asio::ip::tcp::endpoint endpoint(asio::ip::make_address("192.168.1.1"), 12345); |
输出:
1 | Endpoint: 192.168.1.1:12345 |
重要成员函数
构造函数
默认构造
- 创建一个未指定地址和端口的端点(
0.0.0.0:0
或[::]:0
)。1
asio::ip::tcp::endpoint();
- 创建一个未指定地址和端口的端点(
地址和端口构造
- 使用指定的
asio::ip::address
和端口初始化。1
asio::ip::tcp::endpoint(const asio::ip::address& addr, unsigned short port);
- 使用指定的
协议构造
- 使用协议(IPv4/IPv6)和端口初始化,地址为未指定。
1
asio::ip::tcp::endpoint(asio::ip::tcp::v4(), 8080);
- 使用协议(IPv4/IPv6)和端口初始化,地址为未指定。
成员函数
设置地址
1
void address(const asio::ip::address& addr);
修改端点的 IP 地址。
获取地址
1
asio::ip::address address() const;
返回端点的 IP 地址。
设置端口
1
void port(unsigned short port);
修改端点的端口号。
获取端口
1
unsigned short port() const;
返回端点的端口号。
转换为字符串
1
std::string to_string() const;
返回端点的字符串表示形式,例如
127.0.0.1:8080
。
典型用例
客户端
1 | asio::io_context io_context; |
服务器
1 | asio::io_context io_context; |
总结
asio::ip::tcp::endpoint
是 TCP 通信中的一个核心组件,用于描述通信双方的网络位置。它不仅简单易用,而且与其他 Asio 组件(如 tcp::resolver
、tcp::socket
)紧密配合,为构建高效的网络程序提供了强大支持。