开源的socket服务端客户端,支持C# C++

HPSocket.cpp 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. /*
  2. * Copyright: JessMA Open Source (ldcsaa@gmail.com)
  3. *
  4. * Version : 4.1.3
  5. * Author : Bruce Liang
  6. * Website : http://www.jessma.org
  7. * Project : https://github.com/ldcsaa
  8. * Blog : http://www.cnblogs.com/ldcsaa
  9. * Wiki : http://www.oschina.net/p/hp-socket
  10. * QQ Group : 75375912
  11. *
  12. * Licensed under the Apache License, Version 2.0 (the "License");
  13. * you may not use this file except in compliance with the License.
  14. * You may obtain a copy of the License at
  15. *
  16. * http://www.apache.org/licenses/LICENSE-2.0
  17. *
  18. * Unless required by applicable law or agreed to in writing, software
  19. * distributed under the License is distributed on an "AS IS" BASIS,
  20. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  21. * See the License for the specific language governing permissions and
  22. * limitations under the License.
  23. */
  24. #include "stdafx.h"
  25. #include "HPSocket.h"
  26. #include "TcpServer.h"
  27. #include "TcpAgent.h"
  28. #include "TcpClient.h"
  29. #include "TcpPullServer.h"
  30. #include "TcpPullClient.h"
  31. #include "TcpPullAgent.h"
  32. #include "TcpPackServer.h"
  33. #include "TcpPackClient.h"
  34. #include "TcpPackAgent.h"
  35. #include "UdpServer.h"
  36. #include "UdpClient.h"
  37. #include "UdpCast.h"
  38. #include "HttpServer.h"
  39. #include "HttpAgent.h"
  40. #include "HttpClient.h"
  41. /*****************************************************************************************************************************************************/
  42. /****************************************************************** TCP/UDP Exports ******************************************************************/
  43. /*****************************************************************************************************************************************************/
  44. HPSOCKET_API ITcpServer* HP_Create_TcpServer(ITcpServerListener* pListener)
  45. {
  46. return new CTcpServer(pListener);
  47. }
  48. HPSOCKET_API ITcpAgent* HP_Create_TcpAgent(ITcpAgentListener* pListener)
  49. {
  50. return new CTcpAgent(pListener);
  51. }
  52. HPSOCKET_API ITcpClient* HP_Create_TcpClient(ITcpClientListener* pListener)
  53. {
  54. return new CTcpClient(pListener);
  55. }
  56. HPSOCKET_API ITcpPullServer* HP_Create_TcpPullServer(ITcpServerListener* pListener)
  57. {
  58. return (ITcpPullServer*)(new CTcpPullServer(pListener));
  59. }
  60. HPSOCKET_API ITcpPullAgent* HP_Create_TcpPullAgent(ITcpAgentListener* pListener)
  61. {
  62. return (ITcpPullAgent*)(new CTcpPullAgent(pListener));
  63. }
  64. HPSOCKET_API ITcpPullClient* HP_Create_TcpPullClient(ITcpClientListener* pListener)
  65. {
  66. return (ITcpPullClient*)(new CTcpPullClient(pListener));
  67. }
  68. HPSOCKET_API ITcpPackServer* HP_Create_TcpPackServer(ITcpServerListener* pListener)
  69. {
  70. return (ITcpPackServer*)(new CTcpPackServer(pListener));
  71. }
  72. HPSOCKET_API ITcpPackAgent* HP_Create_TcpPackAgent(ITcpAgentListener* pListener)
  73. {
  74. return (ITcpPackAgent*)(new CTcpPackAgent(pListener));
  75. }
  76. HPSOCKET_API ITcpPackClient* HP_Create_TcpPackClient(ITcpClientListener* pListener)
  77. {
  78. return (ITcpPackClient*)(new CTcpPackClient(pListener));
  79. }
  80. HPSOCKET_API IUdpServer* HP_Create_UdpServer(IUdpServerListener* pListener)
  81. {
  82. return new CUdpServer(pListener);
  83. }
  84. HPSOCKET_API IUdpClient* HP_Create_UdpClient(IUdpClientListener* pListener)
  85. {
  86. return new CUdpClient(pListener);
  87. }
  88. HPSOCKET_API IUdpCast* HP_Create_UdpCast(IUdpCastListener* pListener)
  89. {
  90. return new CUdpCast(pListener);
  91. }
  92. HPSOCKET_API void HP_Destroy_TcpServer(ITcpServer* pServer)
  93. {
  94. delete pServer;
  95. }
  96. HPSOCKET_API void HP_Destroy_TcpAgent(ITcpAgent* pAgent)
  97. {
  98. delete pAgent;
  99. }
  100. HPSOCKET_API void HP_Destroy_TcpClient(ITcpClient* pClient)
  101. {
  102. delete pClient;
  103. }
  104. HPSOCKET_API void HP_Destroy_TcpPullServer(ITcpPullServer* pServer)
  105. {
  106. delete pServer;
  107. }
  108. HPSOCKET_API void HP_Destroy_TcpPullAgent(ITcpPullAgent* pAgent)
  109. {
  110. delete pAgent;
  111. }
  112. HPSOCKET_API void HP_Destroy_TcpPullClient(ITcpPullClient* pClient)
  113. {
  114. delete pClient;
  115. }
  116. HPSOCKET_API void HP_Destroy_TcpPackServer(ITcpPackServer* pServer)
  117. {
  118. delete pServer;
  119. }
  120. HPSOCKET_API void HP_Destroy_TcpPackAgent(ITcpPackAgent* pAgent)
  121. {
  122. delete pAgent;
  123. }
  124. HPSOCKET_API void HP_Destroy_TcpPackClient(ITcpPackClient* pClient)
  125. {
  126. delete pClient;
  127. }
  128. HPSOCKET_API void HP_Destroy_UdpServer(IUdpServer* pServer)
  129. {
  130. delete pServer;
  131. }
  132. HPSOCKET_API void HP_Destroy_UdpClient(IUdpClient* pClient)
  133. {
  134. delete pClient;
  135. }
  136. HPSOCKET_API void HP_Destroy_UdpCast(IUdpCast* pCast)
  137. {
  138. delete pCast;
  139. }
  140. /*****************************************************************************************************************************************************/
  141. /******************************************************************** HTTP Exports *******************************************************************/
  142. /*****************************************************************************************************************************************************/
  143. HPSOCKET_API IHttpServer* HP_Create_HttpServer(IHttpServerListener* pListener)
  144. {
  145. return (IHttpServer*)(new CHttpServer(pListener));
  146. }
  147. HPSOCKET_API IHttpAgent* HP_Create_HttpAgent(IHttpAgentListener* pListener)
  148. {
  149. return (IHttpAgent*)(new CHttpAgent(pListener));
  150. }
  151. HPSOCKET_API IHttpClient* HP_Create_HttpClient(IHttpClientListener* pListener)
  152. {
  153. return (IHttpClient*)(new CHttpClient(pListener));
  154. }
  155. HPSOCKET_API IHttpSyncClient* HP_Create_HttpSyncClient()
  156. {
  157. return (IHttpSyncClient*)(new CHttpSyncClient());
  158. }
  159. HPSOCKET_API void HP_Destroy_HttpServer(IHttpServer* pServer)
  160. {
  161. delete pServer;
  162. }
  163. HPSOCKET_API void HP_Destroy_HttpAgent(IHttpAgent* pAgent)
  164. {
  165. delete pAgent;
  166. }
  167. HPSOCKET_API void HP_Destroy_HttpClient(IHttpClient* pClient)
  168. {
  169. delete pClient;
  170. }
  171. HPSOCKET_API void HP_Destroy_HttpSyncClient(IHttpSyncClient* pClient)
  172. {
  173. delete pClient;
  174. }
  175. /*****************************************************************************************************************************************************/
  176. /*************************************************************** Global Function Exports *************************************************************/
  177. /*****************************************************************************************************************************************************/
  178. HPSOCKET_API DWORD HP_GetHPSocketVersion()
  179. {
  180. return ::GetHPSocketVersion();
  181. }
  182. HPSOCKET_API LPCTSTR HP_GetSocketErrorDesc(EnSocketError enCode)
  183. {
  184. return ::GetSocketErrorDesc(enCode);
  185. }
  186. HPSOCKET_API DWORD SYS_GetLastError()
  187. {
  188. return ::GetLastError();
  189. }
  190. HPSOCKET_API int SYS_WSAGetLastError()
  191. {
  192. return ::WSAGetLastError();
  193. }
  194. HPSOCKET_API int SYS_SetSocketOption(SOCKET sock, int level, int name, LPVOID val, int len)
  195. {
  196. return ::SSO_SetSocketOption(sock, level, name, val, len);
  197. }
  198. HPSOCKET_API int SYS_GetSocketOption(SOCKET sock, int level, int name, LPVOID val, int* len)
  199. {
  200. return ::SSO_GetSocketOption(sock, level, name, val, len);
  201. }
  202. HPSOCKET_API int SYS_IoctlSocket(SOCKET sock, long cmd, u_long* arg)
  203. {
  204. return ::SSO_IoctlSocket(sock, cmd, arg);
  205. }
  206. HPSOCKET_API int SYS_WSAIoctl(SOCKET sock, DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer, LPDWORD lpcbBytesReturned)
  207. {
  208. return ::SSO_WSAIoctl(sock, dwIoControlCode, lpvInBuffer, cbInBuffer, lpvOutBuffer, cbOutBuffer, lpcbBytesReturned);
  209. }
  210. HPSOCKET_API int SYS_SSO_NoDelay(SOCKET sock, BOOL bNoDelay)
  211. {
  212. return ::SSO_NoDelay(sock, bNoDelay);
  213. }
  214. HPSOCKET_API int SYS_SSO_DontLinger(SOCKET sock, BOOL bDont)
  215. {
  216. return ::SSO_DontLinger(sock, bDont);
  217. }
  218. HPSOCKET_API int SYS_SSO_Linger(SOCKET sock, USHORT l_onoff, USHORT l_linger)
  219. {
  220. return ::SSO_Linger(sock, l_onoff, l_linger);
  221. }
  222. HPSOCKET_API int SYS_SSO_RecvBuffSize(SOCKET sock, int size)
  223. {
  224. return ::SSO_RecvBuffSize(sock, size);
  225. }
  226. HPSOCKET_API int SYS_SSO_SendBuffSize(SOCKET sock, int size)
  227. {
  228. return ::SSO_SendBuffSize(sock, size);
  229. }
  230. HPSOCKET_API int SYS_SSO_ReuseAddress(SOCKET sock, BOOL bReuse)
  231. {
  232. return ::SSO_ReuseAddress(sock, bReuse);
  233. }
  234. HPSOCKET_API BOOL SYS_GetSocketLocalAddress(SOCKET socket, TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort)
  235. {
  236. return ::GetSocketLocalAddress(socket, lpszAddress, iAddressLen, usPort);
  237. }
  238. HPSOCKET_API BOOL SYS_GetSocketRemoteAddress(SOCKET socket, TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort)
  239. {
  240. return ::GetSocketRemoteAddress(socket, lpszAddress, iAddressLen, usPort);
  241. }
  242. HPSOCKET_API ULONG SYS_GetIPv4InAddr(LPCTSTR lpszAddress)
  243. {
  244. return ::GetIPv4InAddr(lpszAddress);
  245. }
  246. HPSOCKET_API BOOL SYS_IsIPAddress(LPCTSTR lpszAddress)
  247. {
  248. return ::IsIPAddress(lpszAddress);
  249. }
  250. HPSOCKET_API BOOL SYS_GetIPAddress(LPCTSTR lpszHost, TCHAR lpszIP[], int& iIPLenth)
  251. {
  252. return ::GetIPAddress(lpszHost, lpszIP, iIPLenth);
  253. }
  254. HPSOCKET_API BOOL SYS_GetOptimalIPByHostName(LPCTSTR lpszHost, ULONG& ulAddr)
  255. {
  256. IN_ADDR addr;
  257. ::GetOptimalIPByHostName(lpszHost, addr);
  258. ulAddr = addr.s_addr;
  259. return addr.s_addr != 0;
  260. }
  261. HPSOCKET_API ULONGLONG SYS_NToH64(ULONGLONG value)
  262. {
  263. return ::NToH64(value);
  264. }
  265. HPSOCKET_API ULONGLONG SYS_HToN64(ULONGLONG value)
  266. {
  267. return ::HToN64(value);
  268. }
  269. HPSOCKET_API BOOL SYS_CodePageToUnicode(int iCodePage, const char szSrc[], WCHAR szDest[], int& iDestLength)
  270. {
  271. return ::CodePageToUnicode(iCodePage, szSrc, szDest, iDestLength);
  272. }
  273. HPSOCKET_API BOOL SYS_UnicodeToCodePage(int iCodePage, const WCHAR szSrc[], char szDest[], int& iDestLength)
  274. {
  275. return ::UnicodeToCodePage(iCodePage, szSrc, szDest, iDestLength);
  276. }
  277. HPSOCKET_API BOOL SYS_GbkToUnicode(const char szSrc[], WCHAR szDest[], int& iDestLength)
  278. {
  279. return ::GbkToUnicode(szSrc, szDest, iDestLength);
  280. }
  281. HPSOCKET_API BOOL SYS_UnicodeToGbk(const WCHAR szSrc[], char szDest[], int& iDestLength)
  282. {
  283. return ::UnicodeToGbk(szSrc, szDest, iDestLength);
  284. }
  285. HPSOCKET_API BOOL SYS_Utf8ToUnicode(const char szSrc[], WCHAR szDest[], int& iDestLength)
  286. {
  287. return ::Utf8ToUnicode(szSrc, szDest, iDestLength);
  288. }
  289. HPSOCKET_API BOOL SYS_UnicodeToUtf8(const WCHAR szSrc[], char szDest[], int& iDestLength)
  290. {
  291. return ::UnicodeToUtf8(szSrc, szDest, iDestLength);
  292. }
  293. HPSOCKET_API BOOL SYS_GbkToUtf8(const char szSrc[], char szDest[], int& iDestLength)
  294. {
  295. return ::GbkToUtf8(szSrc, szDest, iDestLength);
  296. }
  297. HPSOCKET_API BOOL SYS_Utf8ToGbk(const char szSrc[], char szDest[], int& iDestLength)
  298. {
  299. return ::Utf8ToGbk(szSrc, szDest, iDestLength);
  300. }
  301. HPSOCKET_API int SYS_Compress(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen)
  302. {
  303. return ::Compress(lpszSrc, dwSrcLen, lpszDest, dwDestLen);
  304. }
  305. HPSOCKET_API int SYS_CompressEx(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen, int iLevel, int iMethod, int iWindowBits, int iMemLevel, int iStrategy)
  306. {
  307. return ::CompressEx(lpszSrc, dwSrcLen, lpszDest, dwDestLen, iLevel, iMethod, iWindowBits, iMemLevel, iStrategy);
  308. }
  309. HPSOCKET_API int SYS_Uncompress(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen)
  310. {
  311. return ::Uncompress(lpszSrc, dwSrcLen, lpszDest, dwDestLen);
  312. }
  313. HPSOCKET_API int SYS_UncompressEx(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen, int iWindowBits)
  314. {
  315. return ::UncompressEx(lpszSrc, dwSrcLen, lpszDest, dwDestLen, iWindowBits);
  316. }
  317. HPSOCKET_API DWORD SYS_GuessCompressBound(DWORD dwSrcLen, BOOL bGZip)
  318. {
  319. return ::GuessCompressBound(dwSrcLen, bGZip);
  320. }
  321. HPSOCKET_API int SYS_GZipCompress(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen)
  322. {
  323. return ::GZipCompress(lpszSrc, dwSrcLen, lpszDest, dwDestLen);
  324. }
  325. HPSOCKET_API int SYS_GZipUncompress(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen)
  326. {
  327. return ::GZipUncompress(lpszSrc, dwSrcLen, lpszDest, dwDestLen);
  328. }
  329. HPSOCKET_API DWORD SYS_GZipGuessUncompressBound(const BYTE* lpszSrc, DWORD dwSrcLen)
  330. {
  331. return ::GZipGuessUncompressBound(lpszSrc, dwSrcLen);
  332. }
  333. HPSOCKET_API DWORD SYS_GuessBase64EncodeBound(DWORD dwSrcLen)
  334. {
  335. return ::GuessBase64EncodeBound(dwSrcLen);
  336. }
  337. HPSOCKET_API DWORD SYS_GuessBase64DecodeBound(const BYTE* lpszSrc, DWORD dwSrcLen)
  338. {
  339. return ::GuessBase64DecodeBound(lpszSrc, dwSrcLen);
  340. }
  341. HPSOCKET_API int SYS_Base64Encode(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen)
  342. {
  343. return ::Base64Encode(lpszSrc, dwSrcLen, lpszDest, dwDestLen);
  344. }
  345. HPSOCKET_API int SYS_Base64Decode(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen)
  346. {
  347. return ::Base64Decode(lpszSrc, dwSrcLen, lpszDest, dwDestLen);
  348. }
  349. HPSOCKET_API DWORD SYS_GuessUrlEncodeBound(const BYTE* lpszSrc, DWORD dwSrcLen)
  350. {
  351. return ::GuessUrlEncodeBound(lpszSrc, dwSrcLen);
  352. }
  353. HPSOCKET_API DWORD SYS_GuessUrlDecodeBound(const BYTE* lpszSrc, DWORD dwSrcLen)
  354. {
  355. return ::GuessUrlDecodeBound(lpszSrc, dwSrcLen);
  356. }
  357. HPSOCKET_API int SYS_UrlEncode(BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen)
  358. {
  359. return ::UrlEncode(lpszSrc, dwSrcLen, lpszDest, dwDestLen);
  360. }
  361. HPSOCKET_API int SYS_UrlDecode(BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen)
  362. {
  363. return ::UrlDecode(lpszSrc, dwSrcLen, lpszDest, dwDestLen);
  364. }