S3PDBSocketServer.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:7k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //-----------------------------------------//
  2. //                                         //
  3. //  File : S3PDBSocketServer.cpp    //
  4. // Author : Yang Xiaodong            //
  5. // Modified : 8/26/2002                //
  6. //                                         //
  7. //-----------------------------------------//
  8. #include "S3PDBSocketServer.h"
  9. S3PDBSocketServer::S3PDBSocketServer( SOCKET s, S3PDBSocketPool* pPool ):
  10. m_piRunSignal( NULL ),
  11. m_hServer( NULL ),
  12. m_dwServerThreadId( 0 )
  13. {
  14. m_Socket = s;
  15. m_piRunSignal = new int;
  16. *m_piRunSignal = 0;
  17. m_pSocketPool = pPool;
  18. CreateEnablePoolEvent();
  19. }
  20. S3PDBSocketServer::S3PDBSocketServer( int iPort, S3PDBSocketPool* pPool ):
  21. m_Socket( INVALID_SOCKET ),
  22. m_piRunSignal( NULL ),
  23. m_hServer( NULL ),
  24. m_dwServerThreadId( 0 )
  25. {
  26. m_iPort = iPort;
  27. m_piRunSignal = new int;
  28. *m_piRunSignal = 0;
  29. m_pSocketPool = pPool;
  30. CreateEnablePoolEvent();
  31. }
  32. S3PDBSocketServer::~S3PDBSocketServer()
  33. {
  34. if ( NULL != m_piRunSignal )
  35. {
  36. delete m_piRunSignal;
  37. m_piRunSignal = NULL;
  38. }
  39. }
  40. DWORD WINAPI S3PDBSocketServer::StartServer( LPVOID lpParam )
  41. {
  42. DWORD dwRet = 0;
  43. if ( NULL == lpParam )
  44. {
  45. dwRet = 0;
  46. return dwRet;
  47. }
  48. _LPDBSOCKETSERVERPARAM lpServerParam =
  49. ( _LPDBSOCKETSERVERPARAM )lpParam;
  50. if ( ( NULL == lpServerParam->piRunSignal )
  51. || ( NULL == lpServerParam->pSocketPool ) )
  52. {
  53. dwRet = 0;
  54. return dwRet;
  55. }
  56. S3PDBSocketPool* pSocketPool = lpServerParam->pSocketPool;
  57. SOCKET s = lpServerParam->serverSocket;
  58. int iResult = 0;
  59. IBYTE recvBuf[def_UDPSIZE];
  60. while( 0 != *( lpServerParam->piRunSignal ) )
  61. {
  62. SOCKADDR_IN fromAddr;
  63. memset( recvBuf, 0, def_UDPSIZE );
  64. int iFromLen = sizeof( fromAddr );
  65. iResult = recvfrom( s,
  66. recvBuf,
  67. def_UDPSIZE,
  68. 0,
  69. ( SOCKADDR* )( &fromAddr ),
  70. &iFromLen );
  71. if ( SOCKET_ERROR == iResult )
  72. {
  73. // Reserved code section
  74. continue;
  75. }
  76. else if ( 0 == iResult )
  77. {
  78. // Reserved code section
  79. continue;
  80. }
  81. else
  82. {
  83. S3PDBSocketPool::_DBSOCKETPOOLDATAPACKET poolData;
  84. memcpy( poolData.dataBuf, recvBuf, iResult );
  85. poolData.dwSize = iResult;
  86. poolData.dwFromIP = fromAddr.sin_addr.S_un.S_addr;
  87. poolData.iFromPort = htons( fromAddr.sin_port );
  88. pSocketPool->PushDataPacket( &poolData );
  89. }
  90. }
  91. return dwRet;
  92. }
  93. HANDLE S3PDBSocketServer::Start()
  94. {
  95. HANDLE hRet = NULL;
  96. if ( ( NULL != m_hServer )
  97. || ( NULL == m_piRunSignal )
  98. || ( NULL == m_pSocketPool )
  99. || ( NULL == m_hEnablePool ) )
  100. {
  101. hRet = NULL;
  102. return hRet;
  103. }
  104. // The follow code is used to initialize
  105. // the environment for Windows OS platform
  106. // and should be removed or changed when
  107. // replanted to other platforms.
  108. //------>BEGIN
  109. WORD wVersionRequired = MAKEWORD(1,1);
  110. WSADATA WSAdata;
  111. if ( 0 != WSAStartup( wVersionRequired, &WSAdata ) )
  112. {
  113. hRet = NULL;
  114. return hRet;
  115. }
  116. //<------END
  117. if ( INVALID_SOCKET == m_Socket )
  118. {
  119. if ( FALSE == CreateSocket() )
  120. {
  121. hRet = NULL;
  122. return hRet;
  123. }
  124. }
  125. // Start up server thread
  126. //------>BEGIN
  127. if ( NULL != m_pSocketPool )
  128. {
  129. m_pSocketPool->Init( m_Socket, m_hEnablePool );
  130. m_pSocketPool->Start();
  131. }
  132. *m_piRunSignal = 1;
  133. m_ServerParam.piRunSignal = m_piRunSignal;
  134. m_ServerParam.pSocketPool = m_pSocketPool;
  135. m_ServerParam.serverSocket = m_Socket;
  136. m_hServer =
  137. KPICreateThread( S3PDBSocketServer::StartServer, &m_ServerParam, &m_dwServerThreadId );
  138. hRet = m_hServer;
  139. //<------END
  140. return hRet;
  141. }
  142. BOOL S3PDBSocketServer::CreateSocket()
  143. {
  144. BOOL bRet = FALSE;
  145. if ( INVALID_SOCKET != m_Socket )
  146. {
  147. bRet = FALSE;
  148. return bRet;
  149. }
  150. m_Socket =
  151. socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
  152. if ( INVALID_SOCKET == m_Socket )
  153. {
  154. bRet = FALSE;
  155. return bRet;
  156. }
  157. SOCKADDR_IN local;
  158. local.sin_family = AF_INET;
  159. local.sin_port = htons( ( short )( m_iPort ) );
  160. //local.sin_port = htons( ( short )( KPIHash( "AccountPort", 1000, 7000 ) ) );// Not Completed...
  161. local.sin_addr.s_addr = htonl( INADDR_ANY );
  162. if ( bind( m_Socket, ( SOCKADDR* )( &local ), sizeof( local ) )
  163. == SOCKET_ERROR )
  164. {
  165. closesocket( m_Socket );
  166. m_Socket = INVALID_SOCKET;
  167. bRet = FALSE;
  168. return bRet;
  169. }
  170. bRet = TRUE;
  171. return bRet;
  172. }
  173. BOOL S3PDBSocketServer::ReleaseSocket()
  174. {
  175. BOOL bRet = FALSE;
  176. if ( INVALID_SOCKET != m_Socket )
  177. {
  178. if ( 0 == closesocket( m_Socket ) )
  179. {
  180. m_Socket = INVALID_SOCKET;
  181. bRet = TRUE;
  182. }
  183. }
  184. return bRet;
  185. }
  186. BOOL S3PDBSocketServer::Stop()
  187. {
  188. BOOL bRet = FALSE;
  189. if ( NULL == m_hServer )
  190. {
  191. bRet = FALSE;
  192. return bRet;
  193. }
  194. if ( NULL != m_pSocketPool )
  195. {
  196. if ( FALSE == m_pSocketPool->Stop() )
  197. {
  198. bRet = FALSE;
  199. return bRet;
  200. }
  201. }
  202. *m_piRunSignal = 0;
  203. DWORD dwResult = KPIWaitForSingleObject( m_hServer, 3000 );
  204. if ( 0 == dwResult )
  205. {
  206. bRet = FALSE;
  207. return bRet;
  208. }
  209. else if ( 1 == dwResult ) // The thread has ended.
  210. {
  211. m_hServer = NULL;
  212. bRet = ReleaseSocket();
  213. }
  214. else if ( 2 == dwResult ) // Time out.
  215. {
  216. if ( TRUE == KPITerminateThread( m_hServer, 0 ) )
  217. {
  218. m_hServer = NULL;
  219. bRet = ReleaseSocket();
  220. }
  221. else
  222. {
  223. bRet = FALSE;
  224. return bRet;
  225. }
  226. }
  227. if ( TRUE == bRet )
  228. {
  229. WSACleanup(); // Needed on Windows OS platforms.
  230. }
  231. return bRet;
  232. }
  233. BOOL S3PDBSocketServer::SendUDP( SOCKET s,
  234. DWORD dwTargetIP,
  235. int iTargetPort,
  236. IBYTE buf[def_UDPSIZE],
  237. DWORD dwSize )
  238. {
  239. BOOL bRet = TRUE;
  240. SOCKADDR_IN targetAddr;
  241. targetAddr.sin_family = AF_INET;
  242. targetAddr.sin_port = htons( ( short )( iTargetPort ) );
  243. targetAddr.sin_addr.s_addr = dwTargetIP;
  244. int iResult = sendto( s,
  245. buf,
  246. dwSize,
  247. 0,
  248. ( SOCKADDR* )( &targetAddr ),
  249. sizeof( targetAddr ) );
  250. if ( SOCKET_ERROR == iResult )
  251. {
  252. bRet = FALSE;
  253. }
  254. return bRet;
  255. }
  256. void S3PDBSocketServer::CreateEnablePoolEvent()
  257. {
  258. m_hEnablePool = KPICreateEvent( NULL, TRUE, TRUE, def_ENABLEPOOLEVENTNAME );
  259. if ( NULL != m_hEnablePool )
  260. {
  261. KPIResetEvent( m_hEnablePool );
  262. }
  263. }
  264. SOCKET S3PDBSocketServer::CreateSocket( int iPort )
  265. {
  266. SOCKET socketRet = INVALID_SOCKET;
  267. socketRet =
  268. socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
  269. if ( INVALID_SOCKET == socketRet )
  270. {
  271. return socketRet;
  272. }
  273. SOCKADDR_IN local;
  274. local.sin_family = AF_INET;
  275. local.sin_port = htons( ( short )( iPort ) );
  276. local.sin_addr.s_addr = htonl( INADDR_ANY );
  277. if ( bind( socketRet, ( SOCKADDR* )( &local ), sizeof( local ) )
  278. == SOCKET_ERROR )
  279. {
  280. closesocket( socketRet );
  281. socketRet = INVALID_SOCKET;
  282. return socketRet;
  283. }
  284. return socketRet;
  285. }