acl
3.5.3.0
socket_stream.hpp
浏览该文件的文档.
1
#pragma once
2
#include "../acl_cpp_define.hpp"
3
#if defined(_WIN32) || defined(_WIN64)
4
#include <WinSock2.h>
5
#endif
6
#include <string>
7
#include "
istream.hpp
"
8
#include "
ostream.hpp
"
9
10
struct
ACL_VSTREAM
;
11
12
namespace
acl
{
13
14
class
ACL_CPP_API
socket_stream
15
:
public
istream
16
,
public
ostream
17
{
18
public
:
19
socket_stream
(
void
);
20
virtual
~
socket_stream
(
void
);
21
22
/**
23
* 根据套接字打开的一个网络流
24
* @param fd 套接字
25
* @param udp_mode {bool} 是否是 UDP 方式
26
* @return {bool} 连接是否成功
27
*/
28
#if defined(_WIN32) || defined(_WIN64)
29
bool
open(SOCKET fd,
bool
udp_mode =
false
);
30
#else
31
bool
open(
int
fd,
bool
udp_mode =
false
);
32
#endif
33
34
/**
35
* 根据 ACL_VSTREAM 流打开网络流
36
* @param vstream {ACL_VSTREAM*}
37
* @param udp_mode {bool} 是否是 UDP 方式
38
* @return {bool} 连接是否成功
39
*/
40
bool
open(
ACL_VSTREAM
* vstream,
bool
udp_mode =
false
);
41
42
/**
43
* 连接远程服务器并打开网络连接流
44
* @param addr {const char*} 服务器地址, 若连接域套接口服务器(UNIX平台),
45
* 域套接地址:/tmp/test.sock,在Linux 平台下还可连接抽象域套接字,即
46
* abastract unix socket,为了与普通基于文件路径的unix域套接地址区别,
47
* 在 acl 库中规定如果地址第一个字节为 @,则认为是 Linux 抽象域套接字
48
* (abstract unix domain socket)不过需注意该功能仅有 Linux 平台支持,
49
* 举例,如:@/tmp/test.sock;;
50
* 如果连接一个TCP服务器,则地址格式为: remote_addr[@local_ip],
51
* 如: www.sina.com:80@60.28.250.199,
52
* 意思是绑定本的网卡地址为: 60.28.250.199, 远程连接 www.sina.com 的 80,
53
* 如果由OS自动绑定本地 IP 地址,则可以写为:www.sina.com:80
54
* @param conn_timeout {int} 连接超时时间(单位值取决于 use_ms)
55
* @param rw_timeout {int} 读写超时时间(单位值取决于 use_ms)
56
* @param unit {time_unit_t} 超时时间的时间单位
57
* @return {bool} 连接是否成功
58
*/
59
bool
open(
const
char
* addr,
int
conn_timeout,
int
rw_timeout,
60
time_unit_t
unit =
time_unit_s
);
61
62
/**
63
* 绑定本地 UDP 地址,创建 UDP 网络流对象
64
* @param addr {const char*} 本机地址,格式:ip:port;该地址也可以为
65
* UNIX 域套接字或 Linux 抽象域套接字(Linux abstract unix socket)
66
* @param rw_timeout {int} 读写超时时间(秒)
67
* @param flag {unsigned}
68
* @return {bool} 绑定是否成功
69
*/
70
bool
bind_udp(
const
char
* addr,
int
rw_timeout = 0,
unsigned
flag = 0);
71
72
/**
73
* 关闭套接口读操作
74
* @return {bool}
75
*/
76
bool
shutdown_read(
void
);
77
78
/**
79
* 关闭套接口写操作
80
* @return {bool}
81
*/
82
bool
shutdown_write(
void
);
83
84
/**
85
* 关闭套接口读写操作
86
* @return {bool}
87
*/
88
bool
shutdown_readwrite(
void
);
89
90
/**
91
* 获得网络连接流的套接字连接句柄
92
* @return {ACL_SOCKET} 若出错,则返回 - 1(UNIX 平台)
93
* 或 INVALID_SOCKET(win32平台)
94
*/
95
#if defined(_WIN32) || defined(_WIN64)
96
SOCKET sock_handle(
void
)
const
;
97
#else
98
int
sock_handle(
void
)
const
;
99
#endif
100
101
/**
102
* 解绑套接字与流对象的绑定关系,同时将套接字返回给用户,即
103
* 将该套接字的管理权交给用户,本流对象在释放时不会关闭该套
104
* 接字,但用户接管该套接字后用完后必须将其关闭
105
* 解绑后除了 close/open 的调用有意义外,其它的调用(包括流对
106
* 象读写在内)都无意义
107
* @return {ACL_SOCKET} 返回 ACL_SOCKET_INVALID 表示该流对象
108
* 已经将套接字解绑
109
*/
110
#if defined(_WIN32) || defined(_WIN64)
111
SOCKET unbind_sock(
void
);
112
#else
113
int
unbind_sock(
void
);
114
#endif
115
116
/**
117
* 获得 socket 的类型
118
* @return {int} 返回值有:AF_INET, AF_INT6, AF_UNIX,出错时返回 -1
119
*/
120
int
sock_type(
void
)
const
;
121
122
/**
123
* 获得远程连接的地址
124
* @param full {bool} 是否获得完整地址,即:IP:PORT,如果该参数
125
* 为 false,则仅返回 IP,否则返回 IP:PORT
126
* @return {const char*} 远程连接地址,若返回值 == '\0' 则表示
127
* 无法获得远程连接地址
128
*/
129
const
char
* get_peer(
bool
full =
false
)
const
;
130
131
/**
132
* 获得远程连接的 IP 地址
133
* @return {const char*} 远程连接地址,若返回值 == '\0' 则表示
134
* 无法获得远程连接地址
135
*/
136
const
char
* get_peer_ip(
void
)
const
;
137
138
/**
139
* 设置远程连接对象的地址,对于 TCP 传输方式,不需要显示调用此函数
140
* 设置远程对象地址,UDP 传输方式时需要调用此函数设置远程地址,然后
141
* 才可以向远程连接写数据
142
* @param addr {const char*} 远程连接对象的地址,格式:ip:port
143
* @return {bool} 当流对象未打开时返回 false
144
*/
145
bool
set_peer(
const
char
* addr);
146
147
/**
148
* 获得连接的本地地址
149
* @param full {bool} 是否获得完整地址,即:IP:PORT,如果该参数
150
* 为 false,则仅返回 IP,否则返回 IP:PORT
151
* @return {const char*} 该连接的本地地址,若返回值 == "" 则表示
152
* 无法获得本地地址
153
*/
154
const
char
* get_local(
bool
full =
false
)
const
;
155
156
/**
157
* 获得连接的本地 IP 地址
158
* @return {const char*} 该连接的本地地址,若返回值 == "" 则表示
159
* 无法获得本地地址
160
*/
161
const
char
* get_local_ip(
void
)
const
;
162
163
/**
164
* 设置本地地址
165
* @param addr {const char*} 地址,格式:ip:port
166
* @return {bool} 当流对象未打开时返回 false
167
*/
168
bool
set_local(
const
char
* addr);
169
170
/**
171
* 检查套接口连接的存活状态(内部使用了非阻塞读的方式进行探测)
172
* @return {bool} 当网络连接未打开或已经关闭时该函数返回 false,如果
173
* 连接正常则返回 true
174
*/
175
bool
alive(
void
)
const
;
176
177
/**
178
* 设置 TCP 套接字的 nodelay 功能
179
* @param on {bool} true 表示打开,false 表示关闭
180
* @return {socket_stream&}
181
*/
182
socket_stream
& set_tcp_nodelay(
bool
on);
183
184
/**
185
* 设置 TCP 套接字的 SO_LINGER 选项
186
* @param on {bool} 是否启用 SO_LINGER 选项
187
* @param linger {int} 当SO_LINGER打开时,取消 timed_wait 的时间,单位为秒
188
* @return {socket_stream&}
189
*/
190
socket_stream
& set_tcp_solinger(
bool
on,
int
linger);
191
192
/**
193
* 设置 TCP 套接字的写缓冲区大小
194
* @param size {int} 缓冲区设置大小
195
* @return {socket_stream&}
196
*/
197
socket_stream
& set_tcp_sendbuf(
int
size);
198
199
/**
200
* 设置 TCP 套接字的读缓冲区大小
201
* @param size {int} 缓冲区设置大小
202
* @return {socket_stream&}
203
*/
204
socket_stream
& set_tcp_recvbuf(
int
size);
205
206
/**
207
* 设置 TCP 套接字的非阻塞状态
208
* @param on {bool} 是否设置为非阻塞状态,当为 true 时,
209
* 则该套接字被设为非阻塞状态;否则为阻塞状态
210
* @return {socket_stream&}
211
*/
212
socket_stream
& set_tcp_non_blocking(
bool
on);
213
214
/**
215
* 获得 TCP 套接字是否设置了 nodelay 选项
216
* @return {bool} true 表示打开,false 表示关闭
217
*/
218
bool
get_tcp_nodelay(
void
);
219
220
/**
221
* 获得 TCP 套接字的 linger 值
222
* @return {int} 返回 -1 表示未设置 linger 选项或内部出错,>= 0
223
* 表示设置了 linger 选项且该值表示套接字关闭后该 TCP 连接在内核中
224
* 维持 TIME_WAIT 状态的逗留时间(秒)
225
*/
226
int
get_tcp_solinger(
void
);
227
228
/**
229
* 获取 TCP 套接字的写缓冲区大小
230
* @return {int} 缓冲区大小
231
*/
232
int
get_tcp_sendbuf(
void
);
233
234
/**
235
* 获取 TCP 套接字的读缓冲区大小
236
* @return {int} 缓冲区大小
237
*/
238
int
get_tcp_recvbuf(
void
);
239
240
/**
241
* 判断当前套接字是否被设置了非阻塞模式
242
* @return {bool}
243
* 注:该方法目前仅支持 UNIX 平台
244
*/
245
bool
get_tcp_non_blocking(
void
);
246
247
private
:
248
std::string ipbuf_;
249
const
char
* get_ip(
const
char
* addr, std::string& out);
250
};
251
252
}
// namespace acl
acl::istream
Definition:
istream.hpp:15
acl::time_unit_s
Definition:
stream.hpp:15
acl
Definition:
acl_cpp_init.hpp:4
acl::ostream
Definition:
ostream.hpp:17
acl::time_unit_t
time_unit_t
Definition:
stream.hpp:14
acl::socket_stream
Definition:
socket_stream.hpp:14
ostream.hpp
ACL_VSTREAM
Definition:
acl_vstream.h:66
ACL_CPP_API
#define ACL_CPP_API
Definition:
acl_cpp_define.hpp:16
istream.hpp
include
acl_cpp
stream
socket_stream.hpp
生成于 2021年 九月 10日 星期五 11:14:45 , 为 acl使用
1.8.15