endpoint Class¶
封装底层 bsd socket
地址,支持IPv4和IPv6,包含IP地址和端口信息,可直接用于底层 socket API: bind/connect/sendto/recvfrom
。
语法¶
成员¶
Name | Description |
---|---|
endpoint::endpoint | 构造一个 endpoint 对象 |
公共方法¶
Name | Description |
---|---|
endpoint::operator bool | 检查是否是一个有效地址 |
endpoint::operator= | 赋值运算符重载 |
endpoint::operator& | 取地址运算符重载 |
endpoint::as_is | 从已知地址类型构造 |
endpoint::as_in | 从ip,端口等地址信息构造 |
endpoint::as_un | 构造为unix domain socket地址 |
endpoint::as_is_raw | 从连续内存地址构造 |
endpoint::zeroset | 清零 |
endpoint::af | 设置或获取地址类型(族) |
endpoint::ip | 设置或获取字符串形式ip |
endpoint::port | 设置或获取端口 |
endpoint::addr_v4 | 设置或获取IPv4地址 |
endpoint::is_global | 检查是否是全局地址 |
endpoint::len | 获取地址长度 |
endpoint::to_string | 将地址转换为字符串 |
endpoint::format_to | 格式化地址到字符串 |
endpoint::endpoint¶
构造 endpoint
对象。
endpoint::endpoint();
endpoint::endpoint(const endpoint& rhs);
explicit endpoint::endpoint(const addrinfo* ai);
explicit endpoint::endpoint(const sockaddr* sa);
explicit endpoint::endpoint(const char* str_ep);
endpoint::endpoint(const char* ip, unsigned short port);
endpoint::endpoint(uint32_t addrv4, unsigned short port);
endpoint::endpoint(int family, const void* addr, unsigned short port);
参数¶
rhs
构造endpoint的右值endpoint
对象
ai
构造endpoint的addrinfo信息
sa
构造endpoint的sockaddr信息
str_ep
字符串表示的IP和端口信息,格式为 127.0.0.1:2022
或 [fe80::1]:2033
ip
构造endpoint的IPv4或IPv6地址字符串
port
构造endpoint的端口
addrv4
构造endpoint的4字节无符号整数表示的IPv4地址值
family
构造endpoint的地址类型
addr
构造endpoint地址,地址类型由family决定
endpoint::operator bool¶
检查是否是一个有效地址。
返回值¶
true
: 地址有效, false
:地址无效
endpoint::operator =¶
赋值运算符重载。
返回值¶
返回对象自身的引用。
示例¶
#include "yasio/xxsocket.h"
int main() {
yasio::endpoint ep("127.0.0.1", 2021);
yasio::endpoint ep1("127.0.0.1", 2022);
yasio::endpoint ep3{ep};
ep3 = ep1;
return 0;
}
endpoint::operator &¶
取地址运算符重载。
返回值¶
返回sockaddr*类型,可直接用户底层bsd socket API。
注意¶
如果需要获取ip::endpoint*
类型指针,请使用std::addressof
。
示例¶
#include "yasio/xxsocket.h"
int main() {
yasio::endpoint ep("127.0.0.1", 2021);
yasio::socket sock(AF_INET, SOCK_STREAM, 0);
::connect(sock.native_handle(), &ep, ep.len());
return 0;
}
endpoint::as_is¶
由已知地址信息构造。
endpoint& as_is(const endpoint& rhs);
endpoint& as_is(const addrinfo* info);
endpoint& as_is(const sockaddr* addr);
endpoint& as_is(const char* str_ep);
参数¶
rhs
已有endpoint
对象
info
addrinfo*地址信息
addr
sockaddr*类型地址
str_ep
字符串表示的IP和端口信息,格式为 127.0.0.1:2022
或 [fe80::1]:2033
返回值¶
返回对象自身的引用。
endpoint::as_in¶
由地址类型、地址和端口参数构造。
endpoint& as_in(int family, const void* addr_in, u_short port);
endpoint& as_in(const char* addr, unsigned short port);
endpoint& as_in(uint32_t addrv4, u_short port);
参数¶
family
地址类型
addr_in
in地址,类型由参数family
决定
addr
字符串表示的IPv4或IPv4地址
addrv4
4字节无符号整数表示的IPv4地址
port
端口号
返回值¶
返回对象自身的引用。
endpoint::as_un¶
构造为Unix domain socket的endpoint,当编译器宏 YASIO_ENABLE_UDS
定义时可用。
参数¶
name
Unix domain socket本地磁盘路径,不能超过sizeof(sockaddr::sun_path)
返回值¶
返回对象自身的引用。
endpoint::as_is_raw¶
由已知地址信息构造。
参数¶
ai_addr
地址指针
ai_addrlen
地址长度
返回值¶
返回对象自身的引用。
endpoint::zeroset¶
清空地址。
endpoint::af¶
设置或获取endpoint的地址类型。
参数¶
v
地址类型: 取值 AF_INET
、AF_INET6
返回值¶
返回地址类型。
endpoint::ip¶
设置或获取ip字符串。
参数¶
v
字符串表示的IPv4或IPv6地址,例如: 127.0.0.1、fe80::1
返回值¶
返回字符串表示的IPv4或IPv6地址。
endpoint::port¶
设置或获取端口号。
参数¶
v
端口号
返回值¶
返回端口号。
endpoint::addr_v4¶
设置或获取4字节无符号整数表示的IPv4地址。
参数¶
addr
uint32_t
表示的IPv4地址,会将 endpoint
的地址类型修改为 AF_INET
。
返回值¶
返回4字节无符号整数表示的IPv4地址,如果地址类型不是IPv4则返回0
endpoint::len¶
设置或获取地址长度。
参数¶
n
地址长度
返回值¶
返回地址长度。
endpoint::is_global¶
判断地址是否为全局地址,非回环地址。
返回值¶
true
: 全局地址,false
: 本机回环地址。
endpoint::to_string¶
转换为字符串。
参数¶
flags
格式化标志位,详见: endpoint::fmt_xxx
返回值¶
返回字符串表示的IPv4或IPv6地址,是否包含端口取决于参数flags
。
endpoint::format_to¶
赋值运算符重载。
size_t format_to(std::string& buf, int flags = 0) const;
size_t format_to(char* buf, size_t buf_len, int flags) const;
参数¶
buf
格式化目标缓冲区。
buf_len
格式化目标缓冲区大小,必须确保大于 endpoint::max_fmt_len
。
flags
格式化标志位,详见: endpoint::fmt_xxx
返回值¶
返回字符串表示的IPv4或IPv6地址,是否包含端口取决于参数flags
。
endpoint::fmt_xxx¶
地址格式化标志位枚举值
struct endpoint {
enum
{
fmt_no_local = 1,
fmt_no_port = 2,
fmt_no_port_0 = 4,
fmt_no_un_path = 8,
fmt_default = fmt_no_port_0 | fmt_no_un_path,
};
}
- fmt_no_local: 忽略回环地址
- fmt_no_port: 忽略端口
- fmt_no_port_0: 忽略0端口
- fmt_no_un_path: 忽略unix path
- fmt_default: 忽略0端口和unix path