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