PageRenderTime 35ms CodeModel.GetById 22ms app.highlight 10ms RepoModel.GetById 1ms app.codeStats 0ms

/metaq-client4cpp/ext/lwpr/src/Socket.h

https://github.com/tujianqun/metaq
C++ Header | 224 lines | 76 code | 35 blank | 113 comment | 0 complexity | b5f247ea2a56749b2687453ad0c9b208 MD5 | raw file
  1/*
  2 * $Id: Socket.h 3 2011-08-19 02:25:45Z  $
  3 */
  4#ifndef LWPR_SOCKET_H__
  5#define LWPR_SOCKET_H__
  6#include "LWPRType.h"
  7#include "Buffer.h"
  8#include "OutputStream.h"
  9#include "InputStream.h"
 10#include <string>
 11
 12namespace LWPR
 13{
 14	typedef enum socket_ret_type_e
 15	{
 16		SOCKET_RET_CONNECT_FAILED = -2,		// Socket连接,Connect
 17		SOCKET_RET_FAILED = -1,		// Socket出错
 18		SOCKET_RET_OK = 0,			// Socket状态:正常、可读、可写
 19		SOCKET_RET_TIMEOUT = 1,		// Socket读写超时
 20		SOCKET_RET_FREE = 2,		// Socket不受EventDispatch控制
 21		SOCKET_RET_NOT_WRABLE = 3,	// Socket读队列无数据,或者写队列满了.一般用于select
 22	} SOCKET_RET_TYPE_E;
 23
 24	typedef enum socket_invoke_ret_e
 25	{
 26		SOCKET_INVOKE_OK,//RPC: 调用成功
 27		SOCKET_INVOKE_CONNECT_FAILED, //RPC: 网络连接失败
 28		SOCKET_INVOKE_SEND_DATA_FAILED,//RPC: 发送数据失败
 29		SOCKET_INVOKE_SEND_DATA_TIMEOUT,//RPC: 发送数据超时
 30		SOCKET_INVOKE_RECEIVE_DATA_FAILED,//RPC: 接收数据失败
 31		SOCKET_INVOKE_RECEIVE_DATA_TIMEOUT,//RPC: 接收数据超时
 32		SOCKET_INVOKE_POST_PROCESSING_FAILED,//RPC: 后期数据处理失败
 33	} SOCKET_INVOKE_RET_E;
 34
 35	/**
 36	 * 此结构体用于网络传输(存储为网络字节序)
 37	 */
 38	typedef struct socket_addr_t
 39	{
 40		LWPR::UINT32 ip;
 41		LWPR::UINT16 port;
 42
 43		void Marshal(LWPR::OutputStream& out);
 44		void Unmarshal(LWPR::InputStream& in);
 45	} SOCKET_ADDR_T;
 46
 47	const char* GetSocketInvokeRetDesc(SOCKET_INVOKE_RET_E ret);
 48
 49	class Socket
 50	{
 51	public:
 52		/**
 53		 * 解析地址串
 54		 * 地址串格式1 0
 55		 * 地址串格式2 192.168.0.1:26000
 56		 * 地址串格式3 0.0.0.0:26000
 57		 * 地址串格式4 192.168.0.1:26000~36000
 58		 * 地址串格式5 0.0.0.0:26000~36000
 59		 */
 60		static bool SplitAddr(const char* addr, std::string& host, int& min_port, int& max_port);
 61
 62		/**
 63		 * 地址转化函数
 64		 */
 65		static bool AddrTransform(const char* addr_src, SOCKET_ADDR_T& addr_dest);
 66		static void AddrTransform(const SOCKET_ADDR_T& addr_src, std::string& addr_dest);
 67		static std::string AddrTransform(const SOCKET_ADDR_T& addr_src);
 68		static bool IsAddrEqual(const char* addr1, const char* addr2);
 69
 70		/**
 71		 * fromaddr=192.168.0.1,则toaddr=192.168.0.1
 72		 * fromaddr=www.sina.com,则toaddr=192.168.0.1
 73		 */
 74		static bool HostName2Value(const char* fromhost, std::string& tohost);
 75
 76		/**
 77		 * 创建Server Socket,并监听端口
 78		 * @return 返回监听Socket,如果出错,返回-1
 79		 */
 80		static SOCKET_FD_T CreateServerTCPSocket(const char* host, int port);
 81
 82		/**
 83		 * 创建Server Socket,并监听端口
 84		 * @return 返回监听Socket,如果出错,返回-1
 85		 */
 86		static SOCKET_FD_T CreateServerTCPSocket(const char* addr);
 87
 88		/**
 89		 * 创建UDP Socket
 90		 * @return 返回Socket描述符,如果出错,返回-1
 91		 */
 92		static SOCKET_FD_T CreateServerUDPSocket(LWPR::UINT16& port);
 93
 94		/**
 95		 * 创建UDP Socket
 96		 * @return 返回Socket描述符,如果出错,返回-1
 97		 */
 98		static SOCKET_FD_T CreateClientUDPSocket();
 99
100		/**
101		 * 从连接队列获取连接
102		 * @return 返回连接Socket,如果出错,返回-1
103		 */
104		static SOCKET_FD_T AcceptSocket(SOCKET_FD_T fd);
105
106		/**
107		 * 连接远端服务器
108		 * @return 返回连接Socket,如果出错,返回-1
109		 */
110		static SOCKET_FD_T ConnectRemoteHost(const char* host, int port);
111
112		/**
113		 * 连接远端服务器
114		 * @return 返回连接Socket,如果出错,返回-1
115		 */
116		static SOCKET_FD_T ConnectRemoteHost(const char* addr);
117
118		/**
119		 * 关闭socket
120		 * 注意:执行完关闭操作后,会令fd=-1
121		 */
122		static void CloseSocket(SOCKET_FD_T& fd);
123
124		static void CloseSocketWithShutdown(SOCKET_FD_T& fd);
125
126		/**
127		 * 测试Socket是否可读
128		 *		timeout = 0 不阻塞
129		 *		timeout = INT_MAX 一直阻塞
130		 *		timeout > 0 阻塞指定时间
131		 */
132		static SOCKET_RET_TYPE_E IsSocketReadable(SOCKET_FD_T fd, int timeout);
133
134		/**
135		 * 测试Socket是否可读,如果Socket不可读,则一直阻塞
136		 */
137		static SOCKET_RET_TYPE_E IsSocketReadable(SOCKET_FD_T fd);
138
139		/**
140		 * 测试Socket是否可写
141		 *		timeout = 0 不阻塞
142		 *		timeout = INT_MAX 一直阻塞
143		 *		timeout > 0 阻塞指定时间
144		 */
145		static SOCKET_RET_TYPE_E IsSocketWritable(SOCKET_FD_T fd, int timeout);
146
147		/**
148		 * 测试Socket是否可写,如果Socket不可写,则一直阻塞
149		 */
150		static SOCKET_RET_TYPE_E IsSocketWritable(SOCKET_FD_T fd);
151
152		/**
153		 * 读Socket
154		 *		timeout = 0 不阻塞
155		 *		timeout = INT_MAX 一直阻塞
156		 *		timeout > 0 阻塞指定时间
157		 */
158		static SOCKET_RET_TYPE_E ReadSocket(SOCKET_FD_T fd, LWPR::Buffer& buf, int length, int timeout);
159
160		static SOCKET_RET_TYPE_E ReadSocketAsPossible(SOCKET_FD_T fd, LWPR::Buffer& buf, int timeout);
161
162		/**
163		 * 读Socket,阻塞模式
164		 */
165		static SOCKET_RET_TYPE_E ReadSocket(SOCKET_FD_T fd, LWPR::Buffer& buf, int length);
166
167		/**
168		 * 读Socket
169		 *		timeout = 0 不阻塞
170		 *		timeout = INT_MAX 一直阻塞
171		 *		timeout > 0 阻塞指定时间
172		 */
173		static SOCKET_RET_TYPE_E ReadSocket(SOCKET_FD_T fd, char* buf, int length, int timeout);
174
175		/**
176		 * 读Socket,阻塞模式
177		 */
178		static SOCKET_RET_TYPE_E ReadSocket(SOCKET_FD_T fd, char* buf, int length);
179
180		/**
181		 * 写Socket,如果长度为0,则返回成功
182		 *		timeout = 0 不阻塞
183		 *		timeout = INT_MAX 一直阻塞
184		 *		timeout > 0 阻塞指定时间
185		 */
186		static SOCKET_RET_TYPE_E WriteSocket(SOCKET_FD_T fd, const char* buf, int length, int timeout);
187
188		/**
189		 * 写Socket,阻塞模式
190		 */
191		static SOCKET_RET_TYPE_E WriteSocket(SOCKET_FD_T fd, const char* buf, int length);
192
193		/**
194		 * 向UDP Socket写数据
195		 */
196		static SOCKET_RET_TYPE_E WriteUDPSocket(SOCKET_FD_T fd, const char* addr, const char* buf, int length);
197		static SOCKET_RET_TYPE_E WriteUDPSocket(SOCKET_FD_T fd, int port, const char* buf, int length);
198
199		/**
200		 * 清除UDP Socket队列中数据
201		 */
202		static void ClearUDPSocket(SOCKET_FD_T fd);
203
204		/**
205		 * 清除TCP Socket队列中数据
206		 */
207		static void ClearSocket(SOCKET_FD_T fd);
208
209	public:
210		/**
211		 * 获取已经监听的socket,IP地址和端口号
212		 */
213		static bool GetSocketAddress(int fd, std::string& ip, int& port);
214
215		/**
216		 * 获取本地主机的IP地址
217		 */
218		static bool GetLocalHostIP(std::string& ip);
219
220	private:
221	};
222};
223
224#endif // end of LWPR_SOCKET_H__