ClientTunnel.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. //ClientTunnel.cpp
  2. #include "stdafx.h"
  3. ///////////////////////////////////////////////////////////////////////////////
  4. #include "ClientTunnel.h"
  5. #include "./include/struct_def.h"
  6. ///////////////////////////////////////////////////////////////////////////////
  7. ///////////////////////////////////////////////////////////////////////////////
  8. /////////////////////////Callback functions////////////////////////////////////
  9. /*Get the header length according to header struct*/
  10. static void netGetDataBufLenCb(IN SOCKET hSocket, IN void *pHeaderBuf,OUT unsigned long *nDataLen);
  11. /*net event*/
  12. static void netHandleNetEvent(IN SOCKET hSocket, IN ETransportEvent eEvent,
  13. IN void *pDataBuf, IN unsigned long nDataLen,
  14. IN int nError, IN void *pContext);
  15. ///////////////////////////////////////////////////////////////////////////////
  16. ///////////////////////////////////////////////////////////////////////////////
  17. #pragma comment(lib, "Transport.lib")
  18. CClientTunnel::CClientTunnel()
  19. {
  20. m_hSocket = INVALID_SOCKET;
  21. }
  22. CClientTunnel::~CClientTunnel()
  23. {
  24. }
  25. int CClientTunnel::net_OpenSocket(IN ETransportType eType,IN unsigned short usPort,IN LPTRANSPORT_EVENT eventHandler,void *pContext)
  26. {
  27. TransportStatus status = TRANSPORT_OK;
  28. unsigned long ulHeaderLen = MESSAGE_HEADER_LEN;
  29. /*Use this layer handle event and context,
  30. save the application layer handle event and context*/
  31. m_eventHandler = eventHandler;
  32. m_pContext = pContext;
  33. eventHandler = netHandleNetEvent;
  34. pContext = this;
  35. LPTRANSPORT_GETDATABUFLEN cbHandler = netGetDataBufLenCb;
  36. SOCKET hSocket = CTransportImpl::net_OpenSocket(eType, usPort,
  37. eventHandler,
  38. cbHandler,
  39. ulHeaderLen,
  40. pContext);
  41. if (INVALID_SOCKET == hSocket)
  42. {
  43. return TRANSPORT_ERROR;
  44. }
  45. m_hSocket = hSocket;
  46. return status;
  47. }
  48. void CClientTunnel::net_CloseSocket()
  49. {
  50. CTransportImpl::net_CloseSocket();
  51. }
  52. int CClientTunnel::net_Connect(IN unsigned long ulIPValue, IN unsigned short usPort)
  53. {
  54. int nResult = TRANSPORT_OK;
  55. nResult = CTransportImpl::net_Connect(ulIPValue, usPort);
  56. return nResult;
  57. }
  58. unsigned long CClientTunnel::net_Send(IN void *pHeader,IN void *pMessage,IN unsigned long ulDataLen)
  59. {
  60. unsigned long ulSendLen = 0;
  61. unsigned long ulBufLen = 0;
  62. TMessageHeader *pSendHeader = (TMessageHeader *)pHeader;
  63. ulBufLen = MESSAGE_HEADER_LEN + ulDataLen;
  64. char *pSendBuf = new char[ulBufLen];
  65. memset(pSendBuf, 0, ulBufLen);
  66. TMessageHeader *pMessageHeader = (TMessageHeader *)pSendBuf;
  67. pMessageHeader->byVersion = 101;
  68. pMessageHeader->wHeaderFlag = MESSAGE_HEADER_FLAG;
  69. pMessageHeader->wMessageId = pSendHeader->wMessageId;
  70. pMessageHeader->wMessageSubId = pSendHeader->wMessageSubId;
  71. pMessageHeader->dwDataLen = ulDataLen;
  72. pMessageHeader->wReserve = 0;
  73. memcpy((void *)(pSendBuf + MESSAGE_HEADER_LEN), pMessage, ulDataLen);
  74. /* convert network word */
  75. htons(pMessageHeader->wHeaderFlag);
  76. htons(pMessageHeader->wMessageId);
  77. htons(pMessageHeader->wMessageSubId);
  78. htonl(pMessageHeader->dwDataLen);
  79. htons(pMessageHeader->wCheckSum);
  80. htonl(pMessageHeader->wReserve);
  81. /*Send the message*/
  82. SOCKET hSocket = m_hSocket;
  83. ulSendLen = CTransportImpl::net_Send(hSocket, (void *)pSendBuf, ulBufLen);
  84. /**/
  85. delete[] pSendBuf;
  86. pSendBuf = NULL;
  87. return ulSendLen;
  88. }
  89. ///////////////////////////////////////////////////////////////////////////////
  90. ///////////////////////////////////////////////////////////////////////////////
  91. ////////////////////////////////callback functions/////////////////////////////
  92. void netGetDataBufLenCb(IN SOCKET hSocket, IN void *pHeaderBuf,OUT unsigned long *nDataLen)
  93. {
  94. TMessageHeader *pHeader = NULL;
  95. *nDataLen = 0;
  96. pHeader = (TMessageHeader *)pHeaderBuf;
  97. if (NULL == pHeader)
  98. {
  99. return;
  100. }
  101. if (MESSAGE_HEADER_FLAG != pHeader->wHeaderFlag)
  102. {
  103. return;
  104. }
  105. unsigned long dwDataBufLen = pHeader->dwDataLen;
  106. ntohl(dwDataBufLen);
  107. *nDataLen = dwDataBufLen;
  108. return;
  109. }
  110. void netHandleNetEvent(IN SOCKET hSocket, IN ETransportEvent eEvent,IN void *pDataBuf, IN unsigned long nDataLen,IN int nError, IN void *pContext)
  111. {
  112. /*Notify application layer*/
  113. CClientTunnel *pClientTunnel = (CClientTunnel *)pContext;
  114. if (NULL == pClientTunnel)
  115. {
  116. return;
  117. }
  118. void *pUserData = pClientTunnel->m_pContext;
  119. TransportBool bHandle = TRUE;
  120. if (Transport_ReadEv == eEvent)
  121. {
  122. if (nDataLen <= 0)
  123. {
  124. return;
  125. }
  126. /*提取消息头,获得消息ID*/
  127. char *pMessageBuf = (char *)pDataBuf;
  128. TMessageHeader *pHeader = (TMessageHeader *)pMessageBuf;
  129. /*网络字节顺序的转换*/
  130. ntohs(pHeader->wHeaderFlag);
  131. ntohs(pHeader->wMessageId);
  132. ntohs(pHeader->wMessageSubId);
  133. ntohl(pHeader->dwDataLen);
  134. ntohs(pHeader->wCheckSum);
  135. ntohl(pHeader->wReserve);
  136. bHandle = (MESSAGE_HEADER_FLAG == pHeader->wHeaderFlag);
  137. }
  138. if (bHandle)
  139. {
  140. if (NULL != pClientTunnel->m_eventHandler)
  141. {
  142. pClientTunnel->m_eventHandler(hSocket, eEvent,
  143. pDataBuf, nDataLen,
  144. nError, pUserData);
  145. }
  146. }
  147. }