hxsock.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:13k
源码类别:

Symbian

开发平台:

Visual C++

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