SocketClient.cpp
上传用户:oadesign
上传日期:2013-12-25
资源大小:265k
文件大小:6k
源码类别:

进程与线程

开发平台:

Visual C++

  1. // SocketClient.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "NetDownMTR.h"
  5. #include "SocketClient.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. #pragma comment(lib, "wsock32.lib")
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CSocketClient
  14. CSocketClient::CSocketClient ()
  15. : m_hEvtEndModule ( NULL )
  16. , m_bConnected ( FALSE )
  17. {
  18. }
  19. CSocketClient::~CSocketClient()
  20. {
  21. }
  22. // Do not edit the following lines, which are needed by ClassWizard.
  23. #if 0
  24. BEGIN_MESSAGE_MAP(CSocketClient, CSocket)
  25. //{{AFX_MSG_MAP(CSocketClient)
  26. //}}AFX_MSG_MAP
  27. END_MESSAGE_MAP()
  28. #endif // 0
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CSocketClient member functions
  31. BOOL CSocketClient::Connect(LPCTSTR lpszHost, USHORT nPort)
  32. {
  33. if ( !lpszHost || strlen(lpszHost) <= 0 || nPort < 1 )
  34. return FALSE;
  35. Close ();
  36. if ( !Create () ) return FALSE;
  37. m_bConnected = CSocket::Connect ( lpszHost, nPort );
  38. if ( !m_bConnected )
  39. Log ( L_WARNING, "Connect to [%s:%d] failed", lpszHost, nPort );
  40. return m_bConnected;
  41. }
  42. CString CSocketClient::GetDigitStrAtHead ( LPCTSTR lpszStr )
  43. {
  44. if ( !lpszStr ) return "";
  45. CString csStr = lpszStr;
  46. csStr.TrimLeft(); csStr.TrimRight();
  47. CString csDigitStr;
  48. for ( int i=0; isdigit ( (int)csStr[i] ); i++ )
  49. {
  50. csDigitStr += csStr[i];
  51. }
  52. return csDigitStr;
  53. }
  54. //
  55. // return : ------------------------------------------
  56. // > 0 - 回应代码
  57. // = 0 - 未读到数据
  58. // = -1 - 网络出错
  59. //
  60. int CSocketClient::GetResponse ( CString *pcsResponseStr/*=NULL*/, BOOL bBlock/*=TRUE*/ )
  61. {
  62. if ( pcsResponseStr ) *pcsResponseStr = "";
  63. ASSERT ( m_hSocket != INVALID_SOCKET );
  64. CString csOneLine = GetOneLine ( m_csResponseHistoryString );
  65. if ( csOneLine.IsEmpty () )
  66. {
  67. char szRecvBuf[NET_BUFFER_SIZE] = {0};
  68. int nRet = Receive ( szRecvBuf, sizeof(szRecvBuf), bBlock );
  69. if ( nRet <= 0 )
  70. {
  71. if ( nRet < 0 ) Log ( L_WARNING, "Receive response data failed" );
  72. return nRet;
  73. }
  74. m_csResponseHistoryString += szRecvBuf;
  75. csOneLine = GetOneLine ( m_csResponseHistoryString );
  76. if ( csOneLine.IsEmpty () ) return -1;
  77. }
  78. if ( pcsResponseStr ) *pcsResponseStr = csOneLine;
  79. CString csRetCode = GetDigitStrAtHead ( csOneLine );
  80. // TRACE ( "收到服务器回应:%sn", csOneLine );
  81. return atoi ( csRetCode );
  82. }
  83. BOOL CSocketClient::GetResponse ( int nVerifyCode, CString *pcsResponseStr/*=NULL*/ )
  84. {
  85. CString csResponseStr;
  86. int nResponseCode = GetResponse ( &csResponseStr );
  87. if ( pcsResponseStr ) *pcsResponseStr = csResponseStr;
  88. if ( nResponseCode != nVerifyCode )
  89. {
  90. CString csMsg;
  91. csMsg.Format ( "Receive error response code : %s", csResponseStr );
  92. return FALSE;
  93. }
  94. return TRUE;
  95. }
  96. BOOL CSocketClient::SendString(LPCTSTR lpszData, ...)
  97. {
  98. // 格式化
  99. char szDataBuf[NET_BUFFER_SIZE] = {0};
  100. va_list  va;
  101. va_start (va, lpszData);
  102. _vsnprintf ( szDataBuf, sizeof(szDataBuf)-1, (const char*)lpszData, va);
  103. va_end(va);
  104. TRACE ( "n发送字符串:------------>>>n%snn", szDataBuf );
  105. return Send ( szDataBuf, strlen(szDataBuf) );
  106. }
  107. BOOL CSocketClient::Send(char *data, int size)
  108. {
  109. ASSERT ( m_hEvtEndModule && m_hEvtEndModule != INVALID_HANDLE_VALUE );
  110. ASSERT ( m_hSocket != INVALID_SOCKET );
  111. if ( !data || size < 1 ) return TRUE;
  112. int nRemainBytes = size;
  113. int nSentTotalBytes = 0;
  114. int nSendFailedCount = 0;
  115. while ( nRemainBytes > 0 )
  116. {
  117. int nSentBytes = CSocket::Send ( data+nSentTotalBytes, nRemainBytes );
  118. if ( nSentBytes < 0 )
  119. {
  120. nSendFailedCount ++;
  121. if ( nSendFailedCount > 10 )
  122. {
  123. Log ( L_WARNING, "Send net data block failed" );
  124. m_bConnected = FALSE;
  125. return FALSE;
  126. }
  127. else
  128. {
  129. SLEEP_RETURN ( 100 );
  130. }
  131. }
  132. else
  133. {
  134. nRemainBytes -= nSentBytes;
  135. nSentTotalBytes += nSentBytes;
  136. nSendFailedCount = 0;
  137. }
  138. }
  139. return TRUE;
  140. }
  141. void CSocketClient::SetEventOfEndModule(HANDLE hEvtEndModule)
  142. {
  143. m_hEvtEndModule = hEvtEndModule;
  144. ASSERT ( m_hEvtEndModule && m_hEvtEndModule != INVALID_HANDLE_VALUE );
  145. }
  146. // 从类似 "(192,168,0,2,4,31)" 字符串中得到IP地址和端口号
  147. //
  148. BOOL CSocketClient::GetIPAndPortByPasvString(LPCTSTR lpszPasvString, OUT CString &csIP, OUT USHORT &nPort)
  149. {
  150. if ( !lpszPasvString ) return FALSE;
  151. char *p = strchr ( lpszPasvString, '(' );
  152. if ( !p ) return FALSE;
  153. CString csPasvStr = p+1, csTemp;
  154. int nPosStart = 0, nPosEnd = 0;
  155. int nMultiple = 0, nMantissa = 0;
  156. for ( int i=0; ; i++ )
  157. {
  158. nPosEnd = csPasvStr.Find ( ",", nPosStart );
  159. if ( nPosEnd < 0 )
  160. {
  161. if ( i == 5 )
  162. {
  163. nPosEnd = csPasvStr.Find ( ")", nPosStart );
  164. csTemp = csPasvStr.Mid ( nPosStart, nPosEnd-nPosStart );
  165. nMantissa = atoi ( csTemp );
  166. break;
  167. }
  168. else return FALSE;
  169. }
  170. csTemp = csPasvStr.Mid ( nPosStart, nPosEnd-nPosStart );
  171. csTemp.TrimLeft(); csTemp.TrimRight();
  172. if ( i < 4 )
  173. {
  174. if ( !csIP.IsEmpty () ) csIP += ".";
  175. csIP += csTemp;
  176. }
  177. else if ( i == 4 )
  178. {
  179. nMultiple = atoi ( csTemp );
  180. }
  181. else return FALSE;
  182. nPosStart = nPosEnd + 1;
  183. }
  184. nPort = nMultiple*256 + nMantissa;
  185. return TRUE;
  186. }
  187. //
  188. // return : -----------------------------------------------------------
  189. // >= 0 - 收到的字节数
  190. // -1 - 失败
  191. //
  192. int CSocketClient::Receive(char *szBuf, int size, BOOL bBlock/*=TRUE*/)
  193. {
  194. if ( !szBuf || size < 0 ) return -1;
  195. int nReadSize = 0;
  196. if ( bBlock )
  197. {
  198. nReadSize = CSocket::Receive ( szBuf, size );
  199. if ( nReadSize <= 0 ) nReadSize = -1;
  200. }
  201. else
  202. {
  203. nReadSize = CAsyncSocket::Receive ( szBuf, size );
  204. if ( nReadSize < 0 )
  205. {
  206. if ( WSAEWOULDBLOCK  == GetLastError () )
  207. nReadSize = 0;
  208. else
  209. nReadSize = -1;
  210. }
  211. }
  212. if ( nReadSize == -1 )
  213. {
  214. m_bConnected = FALSE;
  215. }
  216. return nReadSize;
  217. }
  218. void CSocketClient::Disconnect()
  219. {
  220. // ShutDown ( both );
  221. Close ();
  222. m_bConnected = FALSE;
  223. }