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 
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
time_unit_t
Definition: stream.hpp:14
#define ACL_CPP_API