hxsock.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:12k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hxtypes.h"
  36. #include "hxassert.h"
  37. #include "hlxclib/windows.h"
  38. #include "platform/win/sock.h"
  39. #include "platform/win/hxsock.h"
  40. #include "hxheap.h"
  41. #ifdef _DEBUG
  42. #undef HX_THIS_FILE
  43. static const char HX_THIS_FILE[] = __FILE__;
  44. #endif  
  45. static FARPROC HXGetProcAddress( HMODULE hModule, const char* lpProcName)
  46. {
  47.     return GetProcAddress(hModule, OS_STRING(lpProcName));
  48. }
  49. // Create one object that is referenced throughout the system.
  50. CHXSock* sockObj = NULL;
  51. CHXSock::CHXSock() :
  52. m_iInited( NULL ),
  53. m_hLib( NULL ),
  54. _hxaccept( NULL ),
  55. _hxbind( NULL ),
  56. _hxclosesocket( NULL ),
  57. _hxconnect( NULL ),
  58. _hxioctlsocket( NULL ),
  59. _hxgetpeername( NULL ),
  60. _hxgetsockname( NULL ),
  61. _hxgetsockopt( NULL ),
  62. _hxhtonl( NULL ),
  63. _hxhtons( NULL ),
  64. _hxinet_addr( NULL ),
  65. _hxinet_ntoa( NULL ),
  66. _hxlisten( NULL ),
  67. _hxntohl( NULL ),
  68. _hxntohs( NULL ),
  69. _hxrecv( NULL ),
  70. _hxrecvfrom( NULL ),
  71. _hxselect( NULL ),
  72. _hxsend( NULL ),
  73. _hxsendto( NULL ),
  74. _hxsetsockopt( NULL ),
  75. _hxshutdown( NULL ),
  76. _hxsocket( NULL ),
  77. /* Database function prototypes */
  78. _hxgethostbyaddr( NULL ),
  79. _hxgethostbyname( NULL ),
  80. _hxgethostname( NULL ),
  81. #ifndef _WINCE
  82. _hxgetservbyport( NULL ),
  83. _hxgetservbyname( NULL ),
  84. _hxgetprotobynumber( NULL ),
  85. _hxgetprotobyname( NULL ),
  86. #endif /* _WINCE */
  87. /* Microsoft Windows Extension function prototypes */
  88. _hxWSAStartup( NULL ),
  89. _hxWSACleanup( NULL ),
  90. _hxWSASetLastError( NULL ),
  91. _hxWSAGetLastError( NULL ),
  92. #ifndef _WINCE
  93. _hxWSAIsBlocking( NULL ),
  94. _hxWSAUnhookBlockingHook( NULL ),
  95. _hxWSASetBlockingHook( NULL ),
  96. _hxWSACancelBlockingCall( NULL ),
  97. _hxWSAAsyncGetServByName( NULL ),
  98. _hxWSAAsyncGetServByPort( NULL ),
  99. _hxWSAAsyncGetProtoByName( NULL ),
  100. _hxWSAAsyncGetProtoByNumber( NULL ),
  101. _hxWSAAsyncGetHostByName( NULL ),
  102. _hxWSAAsyncGetHostByAddr( NULL ),
  103. _hxWSACancelAsyncRequest( NULL ),
  104. _hxWSAAsyncSelect( NULL ),
  105. #endif /* _WINCE */
  106. _hxWSAFDIsSet( NULL ),
  107. m_nVersion(0)
  108. {
  109. // This is basically a do nothing but init constructor.
  110. // If the load fails we can still come up, but before
  111. // we try to play any network resources we'll need to
  112. // load and init.
  113.     LoadWinsock();
  114. }
  115. CHXSock::~CHXSock()
  116. {
  117.     UnloadWinsock();
  118. }
  119. BOOL CHXSock::LoadWinsock( void )
  120. {
  121. char *pcModule;
  122. if (m_hLib && m_iInited)
  123. {
  124. return( TRUE );
  125. }
  126. if (m_hLib)
  127. {
  128. FreeLibrary( m_hLib );
  129. m_hLib = (HINSTANCE)0;
  130. }
  131. #if defined(WIN32_PLATFORM_PSPC)
  132. pcModule = "WINSOCK.DLL";
  133. m_hLib = LoadLibrary( OS_STRING(pcModule) );
  134. #elif defined( _WIN32 )
  135. // start using WinSock2.0 APIs
  136. pcModule = "WS2_32.DLL";
  137. m_hLib = LoadLibrary( pcModule );
  138. if (!m_hLib)
  139. {
  140.     // fallback to WinSock1.1
  141.     pcModule = "WSOCK32.DLL";
  142.     m_hLib = LoadLibrary( pcModule );
  143. }
  144. #elif defined( _WINDOWS )
  145. pcModule = "AOLSOCK.AOL";
  146. if (GetModuleHandle( pcModule ))
  147. {
  148.     m_hLib = LoadLibrary( pcModule );
  149. }
  150. else
  151. {
  152. pcModule = "WINSOCK.DLL";
  153. m_hLib = LoadLibrary( pcModule );
  154. }
  155. #else
  156. # error No Socket library to bind to.
  157. #endif
  158. #ifndef WIN32_PLATFORM_PSPC
  159. if (m_hLib > (HINSTANCE)HINSTANCE_ERROR)
  160. #else
  161. if (m_hLib)
  162. #endif
  163. {
  164. _hxaccept = (ACCEPT)HXGetProcAddress( m_hLib, "accept" );
  165. _hxbind = (BIND)HXGetProcAddress( m_hLib, "bind" );
  166. _hxclosesocket = (CLOSESOCKET)HXGetProcAddress( m_hLib, "closesocket" );
  167. _hxconnect = (CONNECT)HXGetProcAddress( m_hLib, "connect" );
  168. _hxioctlsocket = (IOCTLSOCKET)HXGetProcAddress( m_hLib, "ioctlsocket" );
  169. _hxgetpeername = (GETPEERNAME)HXGetProcAddress( m_hLib, "getpeername" );
  170. _hxgetsockname = (GETSOCKNAME)HXGetProcAddress( m_hLib, "getsockname" );
  171. _hxgetsockopt = (GETSOCKOPT)HXGetProcAddress( m_hLib, "getsockopt" );
  172. _hxhtonl = (HTONL)HXGetProcAddress( m_hLib, "htonl" );
  173. _hxhtons = (HTONS)HXGetProcAddress( m_hLib, "htons" );
  174. _hxinet_addr = (INET_ADDR)HXGetProcAddress( m_hLib, "inet_addr" );
  175. _hxinet_ntoa = (INET_NTOA)HXGetProcAddress( m_hLib, "inet_ntoa" );
  176. _hxlisten = (LISTEN)HXGetProcAddress( m_hLib, "listen" );
  177. _hxntohl = (NTOHL)HXGetProcAddress( m_hLib, "ntohl" );
  178. _hxntohs = (NTOHS)HXGetProcAddress( m_hLib, "ntohs" );
  179. _hxrecv = (RECV)HXGetProcAddress( m_hLib, "recv" );
  180. _hxrecvfrom = (RECVFROM)HXGetProcAddress( m_hLib, "recvfrom" );
  181. _hxselect = (SELECT)HXGetProcAddress( m_hLib, "select" );
  182. _hxsend = (SEND)HXGetProcAddress( m_hLib, "send" );
  183. _hxsendto = (SENDTO)HXGetProcAddress( m_hLib, "sendto" );
  184. _hxsetsockopt = (SETSOCKOPT)HXGetProcAddress( m_hLib, "setsockopt" );
  185. _hxshutdown = (SHUTDOWN)HXGetProcAddress( m_hLib, "shutdown" );
  186. _hxsocket = (HXSOCKET)HXGetProcAddress( m_hLib, "socket" );
  187. _hxgethostbyaddr = (GETHOSTBYADDR)HXGetProcAddress( m_hLib, "gethostbyaddr" );
  188. _hxgethostbyname = (GETHOSTBYNAME)HXGetProcAddress( m_hLib, "gethostbyname" );
  189. _hxgethostname = (GETHOSTNAME)HXGetProcAddress( m_hLib, "gethostname" );
  190. #ifndef _WINCE
  191. _hxgetservbyport = (GETSERVBYPORT)HXGetProcAddress( m_hLib, "getservbyport" );
  192. _hxgetservbyname = (GETSERVBYNAME)HXGetProcAddress( m_hLib, "getservbyname" );
  193. _hxgetprotobynumber = (GETPROTOBYNUMBER)HXGetProcAddress( m_hLib, "getprotobynumber" );
  194. _hxgetprotobyname = (GETPROTOBYNAME)HXGetProcAddress( m_hLib, "getprotobyname" );
  195. #endif /* _WINCE */
  196. _hxWSAStartup = (WSASTARTUP)HXGetProcAddress( m_hLib, "WSAStartup" );
  197. _hxWSACleanup = (WSACLEANUP)HXGetProcAddress( m_hLib, "WSACleanup" );
  198. #ifdef _WINCE
  199. _hxWSASetLastError = (WSASETLASTERROR)SetLastError;
  200. _hxWSAGetLastError = (WSAGETLASTERROR)GetLastError;
  201. #else
  202. _hxWSASetLastError = (WSASETLASTERROR)HXGetProcAddress( m_hLib, "WSASetLastError" );
  203. _hxWSAGetLastError = (WSAGETLASTERROR)HXGetProcAddress( m_hLib, "WSAGetLastError" );
  204. _hxWSAIsBlocking = (WSAISBLOCKING)HXGetProcAddress( m_hLib, "WSAIsBlocking" );
  205. _hxWSAUnhookBlockingHook = (WSAUNHOOKBLOCKINGHOOK)HXGetProcAddress( m_hLib, "WSAUnhookBlockingHook" );
  206. _hxWSASetBlockingHook = (WSASETBLOCKINGHOOK)HXGetProcAddress( m_hLib, "WSASetBlockingHook" );
  207. _hxWSACancelBlockingCall = (WSACANCELBLOCKINGCALL)HXGetProcAddress( m_hLib, "WSACancelBlockingCall" );
  208. _hxWSAAsyncGetServByName = (WSAASYNCGETSERVBYNAME)HXGetProcAddress( m_hLib, "WSAAsyncGetServByName" );
  209. _hxWSAAsyncGetServByPort = (WSAASYNCGETSERVBYPORT)HXGetProcAddress( m_hLib, "WSAAsyncGetServByPort" );
  210. _hxWSAAsyncGetProtoByName = (WSAASYNCGETPROTOBYNAME)HXGetProcAddress( m_hLib, "WSAAsyncGetProtoByName" );
  211. _hxWSAAsyncGetProtoByNumber = (WSAASYNCGETPROTOBYNUMBER)HXGetProcAddress( m_hLib, "WSAAsyncGetProtoByNumber" );
  212. _hxWSAAsyncGetHostByName = (WSAASYNCGETHOSTBYNAME)HXGetProcAddress( m_hLib, "WSAAsyncGetHostByName" );
  213. _hxWSAAsyncGetHostByAddr = (WSAASYNCGETHOSTBYADDR)HXGetProcAddress( m_hLib, "WSAAsyncGetHostByAddr" );
  214. _hxWSACancelAsyncRequest = (WSACANCELASYNCREQUEST)HXGetProcAddress( m_hLib, "WSACancelAsyncRequest" );
  215. _hxWSAAsyncSelect = (WSAASYNCSELECT)HXGetProcAddress( m_hLib, "WSAAsyncSelect" );
  216. #endif /* _WINCE */
  217. _hxWSAFDIsSet = (__WSAFDISSET)HXGetProcAddress( m_hLib, "__WSAFDIsSet" );
  218. SetInited();
  219. }
  220. else
  221. {
  222. m_hLib = NULL;
  223. // Init failed on creation, set all our function pointers to NULL
  224. _hxaccept =  NULL;
  225. _hxbind =  NULL;
  226. _hxclosesocket =  NULL;
  227. _hxconnect =  NULL;
  228. _hxioctlsocket = NULL;
  229. _hxgetpeername = NULL;
  230. _hxgetsockname = NULL;
  231. _hxgetsockopt = NULL;
  232. _hxhtonl = NULL;
  233. _hxhtons = NULL;
  234. _hxinet_addr = NULL;
  235. _hxinet_ntoa = NULL;
  236. _hxlisten = NULL;
  237. _hxntohl = NULL;
  238. _hxntohs = NULL;
  239. _hxrecv = NULL;
  240. _hxrecvfrom = NULL;
  241. _hxselect = NULL;
  242. _hxsend = NULL;
  243. _hxsendto = NULL;
  244. _hxsetsockopt = NULL;
  245. _hxshutdown = NULL;
  246. _hxsocket = NULL;
  247. _hxgethostbyaddr = NULL;
  248. _hxgethostbyname = NULL;
  249. _hxgethostname = NULL;
  250. #ifndef _WINCE
  251. _hxgetservbyport = NULL;
  252. _hxgetservbyname = NULL;
  253. _hxgetprotobynumber = NULL;
  254. _hxgetprotobyname = NULL;
  255. #endif /* _WINCE */
  256. _hxWSAStartup = NULL;
  257. _hxWSACleanup = NULL;
  258. _hxWSASetLastError = NULL;
  259. _hxWSAGetLastError = NULL;
  260. #ifndef _WINCE
  261. _hxWSAIsBlocking = NULL;
  262. _hxWSAUnhookBlockingHook = NULL;
  263. _hxWSASetBlockingHook = NULL;
  264. _hxWSACancelBlockingCall = NULL;
  265. _hxWSAAsyncGetServByName = NULL;
  266. _hxWSAAsyncGetServByPort = NULL;
  267. _hxWSAAsyncGetProtoByName = NULL;
  268. _hxWSAAsyncGetProtoByNumber = NULL;
  269. _hxWSAAsyncGetHostByName = NULL;
  270. _hxWSAAsyncGetHostByAddr = NULL;
  271. _hxWSACancelAsyncRequest = NULL;
  272. _hxWSAAsyncSelect = NULL;
  273. #endif /* _WINCE */
  274. _hxWSAFDIsSet = NULL;
  275. m_iInited = FALSE;
  276. }
  277. return( WinSockAvail() );
  278. }
  279. void CHXSock::UnloadWinsock(BOOL bDestuction)
  280. {
  281. if (m_hLib)
  282. {
  283. FreeLibrary( m_hLib );
  284. }
  285. m_hLib = (HINSTANCE)0;
  286. m_iInited = FALSE;
  287. }
  288. void CHXSock::SetInited( void )
  289. {
  290. if (!m_hLib)
  291. {
  292. return;
  293. }
  294. if (!_hxaccept || !_hxbind || !_hxclosesocket || !_hxconnect || 
  295.  !_hxioctlsocket || !_hxgetpeername || !_hxgetsockname || !_hxgetsockopt ||
  296.  !_hxhtonl || !_hxhtons || !_hxinet_addr || !_hxinet_ntoa || !_hxlisten ||
  297.  !_hxntohl || !_hxntohs || !_hxrecv || !_hxrecvfrom || !_hxselect || 
  298.  !_hxsend || !_hxsendto || !_hxsetsockopt || !_hxshutdown || !_hxsocket ||
  299.  !_hxgethostbyaddr || !_hxgethostbyname || !_hxgethostname || 
  300.  !_hxWSAStartup || !_hxWSACleanup || 
  301.  !_hxWSASetLastError || !_hxWSAGetLastError || !_hxWSAFDIsSet
  302. #ifndef _WINCE
  303.  || !_hxgetservbyport || !_hxgetservbyname || !_hxgetprotobynumber ||
  304.  !_hxgetprotobyname || !_hxWSAUnhookBlockingHook || !_hxWSAIsBlocking ||
  305.  !_hxWSAAsyncGetHostByAddr || !_hxWSASetBlockingHook || 
  306.  !_hxWSACancelBlockingCall || !_hxWSAAsyncGetServByName || 
  307.  !_hxWSAAsyncGetServByPort || !_hxWSAAsyncGetProtoByName || 
  308.  !_hxWSAAsyncSelect || !_hxWSAAsyncGetProtoByNumber || 
  309.  !_hxWSACancelAsyncRequest || !_hxWSAAsyncGetHostByName 
  310. #endif /* _WINCE */
  311.  )
  312. {
  313. m_iInited = FALSE;
  314. HX_ASSERT( m_iInited );
  315. if (m_hLib)
  316. {
  317. FreeLibrary( m_hLib );
  318. m_hLib = NULL;
  319. }
  320. }
  321. else
  322. {
  323. m_iInited = TRUE;
  324. }
  325. }
  326. BOOL CHXSock::InitWinsock( void )
  327. {
  328. BOOL bInited = FALSE;
  329. int err;                
  330. WORD wVersionRequested;
  331. WSADATA wsaData;
  332. wVersionRequested = (1 << 8) + 1;
  333. err = HXWSAStartup( wVersionRequested, &wsaData );
  334. // Check Winsock is the correct version
  335. if (err == 0) 
  336. {
  337.     if (LOBYTE( wsaData.wVersion ) == 1 && HIBYTE( wsaData.wVersion ) == 1) 
  338.     {
  339. bInited = TRUE;
  340.     }
  341.     else
  342.     {
  343. HXWSACleanup();
  344.     }
  345. }
  346. m_nVersion = LOBYTE(wsaData.wHighVersion);
  347. return bInited;
  348. }
  349. UINT8 CHXSock::HXGetVersion(void)
  350. {
  351.     return m_nVersion;
  352. }