Socket.h
上传用户:maryhy001
上传日期:2007-05-02
资源大小:2317k
文件大小:9k
源码类别:

网格计算

开发平台:

Visual C++

  1. //File Name : Socket.h.
  2. //Standard Net Socket Class header file that writen by Devia.
  3. //This code is free all, you can distribute it.
  4. //Author : Devia Li(devia@sina.com)
  5. //DateTime : 2004-04-02
  6. #ifndef _SOCKET_H
  7. #define _SOCKET_H
  8. #include "Mutex.h"
  9. #include "SafeVector.h"
  10. #include "NetAddress.h"
  11. //CXBaseSocket --- Original socket class,
  12. //    all socket inherited it.
  13. class NETLIBDLLEXPORT CXBaseSocket
  14. {
  15. public:
  16. CXBaseSocket();
  17. virtual ~CXBaseSocket();
  18. //create a new CXBaseSocket object.
  19. //!!!"WSAStartup" must be invoked here!!!
  20. virtual bool Create();
  21. //create the CXBaseSocket object from a socket descriptor.
  22. virtual bool CreateByHandle(const SOCKET s);
  23. //destroy the CXBaseSocket object.
  24. //!!!"WSACleanup" must be invoked here.!!!
  25. virtual void Destroy();
  26. //Get the socket's infos
  27. const SOCKET Get_Socket_Handle();
  28. const ushort Get_Socket_Type();
  29. //
  30. const CXNetAddress &Get_Socket_Address();
  31. void Set_Socket_Address(const uint wPort, const char *pIpAddr = NULL);
  32. void Set_Socket_Address(CXNetAddress &pNetAddr);
  33. //determine the socket handle whether is valid
  34. const bool Socket_IsValid(void);
  35. //determine the socket whether is in opened state.
  36. const bool Socket_IsOpened();
  37. //determine the socket whether or not is blocking mode.
  38. const bool Socket_IsBlockingMode();
  39. //operator overrides
  40. operator SOCKET();
  41. //get / set socket timeout value.
  42. int GetTimeouts(void);
  43. bool SetTimeouts(const int nMillSecTimeOut);
  44. //override functions
  45. //bWantOpen = TRUE  ---> Open the socket
  46. // = FALSE ---> Close the socket
  47. virtual bool Open(const bool bWantOpen = true);
  48. //select operation...
  49. //nOpt : 0 --- read / 1 --- write
  50. int Select(int nOpt = 1, int nMillSecTimeOut = -1);
  51. //receive and send buffer data
  52. int  ReceiveBuf(void *lpBuf, const int nSize);
  53. int  SendBuf(const void *lpBuf, const int nSize); 
  54. //get the local  socket name
  55. string Get_LocalHost_Name();
  56. //get the local  socket IP
  57. string Get_LocalHost_IP();
  58. //get the remote socket name
  59. string Get_RemoteHost_Name();
  60. //get the remote socket name
  61. string Get_RemoteHost_IP();
  62. //look up the host ip info from the host name.
  63. static string LookupHostName(const char *lpszHostName);
  64. protected:
  65. //get the socket event mask value
  66. long Get_SockEventMask();
  67. //set or reset the socket event.
  68. bool Set_ASyncStyles(HWND hWnd);
  69. //"listen、accept server socket functions
  70. virtual bool Listen(const int nQueueSize = 2);
  71. virtual SOCKET Accept();
  72. //"AsyncSelect" functions
  73. virtual bool AsyncSelect(HWND hWnd, long lSockEventMask);
  74. //!!! Socket IO controler(For example: Blocking and None Blocking control)
  75. // If "AsyncSelect" function has been issued on a socket, 
  76. // then any attempt to use ioctlsocket to set the socket 
  77. // back to blocking mode will fail with WSAEINVAL.
  78. // use can get the "m_bBlockingMode" member variable flag
  79. // determine the socket current whether is in Blocking mode.
  80. bool IOCtrl(long lCommand, ulong ulArgp, int &nResult);
  81. protected:
  82. //common socket properties
  83. SOCKET m_hSocket; //base socket handle
  84. CXNetAddress m_saSockAddr; //........... address object
  85. bool m_bIsActivity; //........... whether or not in the activity state
  86. bool m_bIsServer; //flag the socket whether is server socket.
  87. //server socket listening pending queue size
  88. int m_nQueueSize;
  89. //Windows socket event flag.
  90. long m_lEventMask;
  91. //flag the socket whether or not is blocking mode.
  92. bool m_bBlockingMode;
  93. private:
  94. int m_stSockType; //........... socket type
  95. bool m_bInitWinSockDll; //flag whether or not initialize socket library successfully.
  96. int m_nMillSecTimeOut; //socket timeout value.
  97. };
  98. //CXWinSocket --- windows socket based on the socket event
  99. //   and windows messages.
  100. class NETLIBDLLEXPORT CXWinSocket : public CXBaseSocket
  101. {
  102. public:
  103. CXWinSocket();
  104. virtual ~CXWinSocket();
  105. //create a new CXWinSocket object.
  106. virtual bool Create();
  107. //create the CXWinSocket object from a socket descriptor.
  108. virtual bool CreateByHandle(const SOCKET s);
  109. //destroy the CXWinSocket object.
  110. virtual void Destroy();
  111. //"AsyncSelect" functions
  112. virtual bool AsyncSelect(HWND hWnd, long lSockEventMask);
  113. //get the socket message receiver window's handle.
  114. HWND Get_Socket_WndHandle();
  115. protected:
  116. //do the socket self event process.
  117. void DoEvent(int nEventMask);
  118. virtual void OnAccept(CXWinSocket *pSvrtSocket){ /*empty*/}
  119. virtual void OnClose(CXWinSocket *pPeerSocket){ /*empty*/}
  120. virtual void OnConnect(CXWinSocket *pClientSocket){ /*empty*/}
  121. virtual void OnRead(CXWinSocket *pSocket){ /*empty*/} 
  122. virtual void OnWrite(CXWinSocket *pSocket){ /*empty*/}
  123. virtual void OnOutofBound(CXWinSocket *pSocket){ /*empty*/}
  124. private:
  125. //windows socket message procedure.
  126. static LRESULT CALLBACK SockMsgProc(
  127. HWND hwnd, // handle to window
  128. UINT uMsg, // message identifier
  129. WPARAM wParam, // first message parameter
  130. LPARAM lParam // second message parameter
  131. );
  132. private:
  133. HWND m_hWnd; //socket message receiver window's handle.
  134. };
  135. //########################################################
  136. class CXWinServerSocket;
  137. //CXWinServerSocket --- windows server client socket based on 
  138. // the windows socket CXWinSocket.
  139. class NETLIBDLLEXPORT CXWinServerClientSocket : public CXWinSocket
  140. {
  141. public:
  142. CXWinServerClientSocket();
  143. virtual ~CXWinServerClientSocket();
  144. //create the server client socket object 
  145. //from a socket handle and server socket object
  146. bool Create(const SOCKET s, CXWinServerSocket *pServerSocket);
  147. //destroy the CXWinSocket object.
  148. virtual void Destroy();
  149. protected:
  150. void OnClose(CXWinSocket *pPeerSocket);
  151. void OnRead(CXWinSocket *pSocket); 
  152. void OnWrite(CXWinSocket *pSocket);
  153. void OnOutofBound(CXWinSocket *pSocket);
  154. private:
  155. CXWinServerSocket *m_pServerSocket;
  156. };
  157. //CXWinServerSocket --- windows server socket based on the 
  158. // windows socket CXWinSocket.
  159. class NETLIBDLLEXPORT CXWinServerSocket : public CXWinSocket
  160. {
  161. public:
  162. CXWinServerSocket();
  163. virtual ~CXWinServerSocket();
  164. //create a new CXWinServerSocket object.
  165. virtual bool Create();
  166. //destroy the CXWinServerSocket object.
  167. virtual void Destroy();
  168. //override functions
  169. //bWantOpen = TRUE  ---> Open the socket
  170. // = FALSE ---> Close the socket
  171. virtual bool Open(const bool bWantOpen = true);
  172. //get the client connections count.
  173. const uint Get_ClientCounts();
  174. //get someone client on special index position.
  175. CXWinSocket *Get_ClientFromPos(const uint index);
  176. //find someone client connection from it's descriptor.
  177. CXWinSocket *Find_ClientFromHandle(SOCKET s, int *pos);
  178. //do the client socket event.
  179. void DoClientEvent(CXWinSocket *pClientSocket, int nEventMask);
  180. protected:
  181. //client event do here.
  182. virtual void OnClientConnect(CXWinSocket *pClientSocket){ /*empty*/};
  183. virtual void OnClientClose(CXWinSocket *pClientSocket){ /*empty*/};
  184. virtual void OnClientRead(CXWinSocket *pClientSocket){ /*empty*/};
  185. virtual void OnClientWrite(CXWinSocket *pClientSocket){ /*empty*/};
  186. virtual void OnClientOutofBound(CXWinSocket *pClientSocket){ /*empty*/};
  187. //self event do here.
  188. virtual bool OnAcceptVerify(CXWinSocket *pClientSocket);
  189. virtual void OnAccept(CXWinSocket *pSvrtSocket);
  190. private:
  191. //add someone client connection.
  192. void Add_Client(CXWinSocket *pSocket);
  193. //remove special client connection.
  194. void Remove_Client(CXWinSocket *pSocket);
  195. //remove all client connections.
  196. void Remove_AllClients();
  197. private:
  198. safe_vector<CXWinSocket*> m_lstConnections; //client connection list.
  199. };
  200. //CXWinClientSocket --- windows server socket based on the 
  201. // windows socket CXWinSocket.
  202. class NETLIBDLLEXPORT CXWinClientSocket : public CXWinSocket
  203. {
  204. public:
  205. CXWinClientSocket();
  206. virtual ~CXWinClientSocket();
  207. //create a new CXWinClientSocket object.
  208. virtual bool Create();
  209. //destroy the CXWinClientSocket object.
  210. virtual void Destroy();
  211. //override functions
  212. //bWantOpen = TRUE  ---> Open the socket
  213. // = FALSE ---> Close the socket
  214. virtual bool Open(const bool bWantOpen = true);
  215. //overrides event functions
  216. protected:
  217. virtual void OnClose(CXWinSocket *pPeerSocket);
  218. virtual void OnConnect(CXWinSocket *pClientSocket);
  219. virtual void OnRead(CXWinSocket *pSocket);
  220. virtual void OnWrite(CXWinSocket *pSocket);
  221. virtual void OnOutofBound(CXWinSocket *pSocket);
  222. private:
  223. //connect to server socket function.
  224. bool ConnectServer();
  225. };
  226. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  227. //CXClientSocket --- windows server socket based on the 
  228. // windows socket CXWinSocket.
  229. class NETLIBDLLEXPORT CXClientSocket : public CXBaseSocket
  230. {
  231. public:
  232. CXClientSocket();
  233. virtual ~CXClientSocket();
  234. //create a new CXClientSocket object.
  235. virtual bool Create();
  236. //destroy the CXClientSocket object.
  237. virtual void Destroy();
  238. //override functions
  239. //bWantOpen = TRUE  ---> Open the socket
  240. // = FALSE ---> Close the socket
  241. virtual bool Open(const bool bWantOpen = true);
  242. private:
  243. //connect to server socket function.
  244. bool ConnectServer();
  245. };
  246. #endif //_SOCKET_H