Communication.cpp
上传用户:hysujiao87
上传日期:2007-12-02
资源大小:156k
文件大小:7k
源码类别:

ICQ/即时通讯

开发平台:

C/C++

  1. #include "stdafx.h"
  2. #include "communication.h"
  3. #include "xmlparser.h"
  4. #include "QQSocket.h"
  5. #include <memory>
  6. using namespace std;
  7. CCommunication::CCommunication(void)
  8. {
  9. _created = FALSE;
  10. _connected = FALSE;
  11. ::ZeroMemory(&_addrServer, sizeof(sockaddr_in));
  12. }
  13. CCommunication::~CCommunication(void)
  14. {
  15. }
  16. HRESULT CCommunication::create(void)
  17. {
  18. if (_created)
  19. return S_FALSE;
  20. if (_sock.Create(0, SOCK_STREAM) == FALSE)
  21. {
  22. TRACE("ERROR: Can't create the client socket.n");
  23. return E_FAIL;
  24. }
  25.     _created = TRUE;
  26. return S_OK;
  27. }
  28. HRESULT CCommunication::connect(LPCTSTR serverIP, short port/*=6000*/)
  29. {
  30. _ASSERTE(serverIP != NULL);
  31. if (serverIP == NULL)
  32. return E_INVALIDARG;
  33. CQQSocket::stringToIPAddr(serverIP, _addrServer);
  34. _addrServer.sin_port = htons(port);
  35. _ASSERTE(_connected == FALSE);
  36. if (_connected)
  37. return S_FALSE;
  38. if (_sock.Connect((SOCKADDR*)&_addrServer, sizeof(sockaddr_in)) == FALSE)
  39. {
  40. DWORD error = _sock.GetLastError();
  41. TRACE("ERROR: Can't connect to the server (%ld).n", error);
  42. return E_FAIL;
  43. }
  44. _connected = TRUE;
  45. return S_OK;
  46. }
  47. HRESULT CCommunication::init(LPCTSTR serverIP, short port/*=6000*/)
  48. {
  49. if (create() != S_OK)
  50. {
  51. AfxMessageBox(_T("错误:无法创建Socket."));
  52. return E_FAIL;
  53. }
  54. if (connect(serverIP) != S_OK)
  55. {
  56. AfxMessageBox(_T("错误:无法连接服务器"));
  57. return E_FAIL;
  58. }
  59. return S_OK;
  60. }
  61. HRESULT CCommunication::sendLogonRequest(LPCTSTR userID, LPCTSTR password)
  62. {
  63. CXMLParser parser;
  64. CElement *root = parser.createElement(_T("REQUEST"), _T(""));
  65. root->AddChild(_T("type"), _T("LOGON"));
  66. root->AddChild(_T("userID"), userID);
  67. root->AddChild(_T("password"), password);
  68. parser.set_root(root);
  69. if (parser.BuildXML() != 0)
  70. return E_FAIL;
  71. CString sendOut = parser.get_xml();
  72. int ret = _sock.Send((BYTE*)((LPCTSTR)sendOut), sendOut.GetLength());
  73. if (ret == SOCKET_ERROR)
  74. {
  75. AfxMessageBox("发送请求失败.");
  76. return E_FAIL;
  77. }
  78. return S_OK;
  79. }
  80. HRESULT CCommunication::sendLogoffRequest(LPCTSTR userID)
  81. {
  82. CXMLParser parser;
  83. CElement *root = parser.createElement(_T("REQUEST"), _T(""));
  84. root->AddChild(_T("type"), _T("LOGOFF"));
  85. root->AddChild(_T("userID"), userID);
  86. parser.set_root(root);
  87. if (parser.BuildXML() != 0)
  88. return E_FAIL;
  89. CString sendOut = parser.get_xml();
  90. int ret = _sock.Send((BYTE*)((LPCTSTR)sendOut), sendOut.GetLength());
  91. if (ret == SOCKET_ERROR)
  92. {
  93. DWORD error = _sock.GetLastError();
  94. TRACE("ERROR: Failed to send the LOGOFF request (%ld).", error);
  95. return E_FAIL;
  96. }
  97. return S_OK;
  98. }
  99. HRESULT CCommunication::sendRegisterRequest(LPCTSTR userID, LPCTSTR password, LPCTSTR nickname)
  100. {
  101. CXMLParser parser;
  102. CElement *root = parser.createElement(_T("REQUEST"), _T(""));
  103. root->AddChild(_T("type"), _T("REGISTER"));
  104. root->AddChild(_T("userID"), userID);
  105. root->AddChild(_T("password"), password);
  106. root->AddChild(_T("nickname"), nickname);
  107. parser.set_root(root);
  108. if (parser.BuildXML() != 0)
  109. return E_FAIL;
  110. CString sendOut = parser.get_xml();
  111. int ret = _sock.Send((BYTE*)((LPCTSTR)sendOut), sendOut.GetLength());
  112. if (ret == SOCKET_ERROR)
  113. {
  114. AfxMessageBox("发送请求失败.");
  115. return E_FAIL;
  116. }
  117. return S_OK;
  118. }
  119. HRESULT CCommunication::sendAddFriendRequest(LPCTSTR userID, LPCTSTR friendID)
  120. {
  121. CXMLParser parser;
  122. CElement *root = parser.createElement(_T("REQUEST"), _T(""));
  123. root->AddChild(_T("type"), _T("ADDFRIEND"));
  124. root->AddChild(_T("userID"), userID);
  125. root->AddChild(_T("friendID"), friendID);
  126. parser.set_root(root);
  127. if (parser.BuildXML() != 0)
  128. return E_FAIL;
  129. CString sendOut = parser.get_xml();
  130. int ret = _sock.Send((BYTE*)((LPCTSTR)sendOut), sendOut.GetLength());
  131. if (ret == SOCKET_ERROR)
  132. {
  133. AfxMessageBox("发送请求失败.");
  134. return E_FAIL;
  135. }
  136. return S_OK;
  137. }
  138. HRESULT CCommunication::sendDownloadFriendsRequest(LPCTSTR userID)
  139. {
  140. CXMLParser parser;
  141. CElement *root = parser.createElement(_T("REQUEST"), _T(""));
  142. root->AddChild(_T("type"), _T("DOWNLOADFRIENDS"));
  143. root->AddChild(_T("userID"), userID);
  144. parser.set_root(root);
  145. if (parser.BuildXML() != 0)
  146. return E_FAIL;
  147. CString sendOut = parser.get_xml();
  148. int ret = _sock.Send((BYTE*)((LPCTSTR)sendOut), sendOut.GetLength());
  149. if (ret == SOCKET_ERROR)
  150. {
  151. AfxMessageBox("发送请求失败.");
  152. return E_FAIL;
  153. }
  154. return S_OK;
  155. }
  156. HRESULT CCommunication::receiveResponse(CXMLParser &parser, DWORD timeOut, BOOL popupMessage)
  157. {
  158. DWORD lastTime = ::GetTickCount();
  159. DWORD dataInBuffer = 0;
  160. while(dataInBuffer <= 0)
  161. {
  162. BOOL ret = _sock.IOCtl(FIONREAD, &dataInBuffer);
  163. if (ret != TRUE)
  164. {
  165. DWORD error = _sock.GetLastError();
  166. TRACE("IOCtl() failed (%d)n", error);
  167. return E_FAIL;
  168. }
  169. if (::GetTickCount() - lastTime > timeOut)
  170. {
  171. AfxMessageBox(_T("错误:连接服务器超时."));
  172. return E_FAIL;
  173. }
  174. }
  175. auto_ptr<BYTE> receiveBuffer(new BYTE[dataInBuffer]);
  176. int actualReceived = _sock.Receive(receiveBuffer.get(),
  177.    dataInBuffer);
  178. if (actualReceived == SOCKET_ERROR)
  179. {
  180. DWORD error = _sock.GetLastError();
  181. CString msg;
  182. msg.Format("错误:无法连接服务器(%ld)", error);
  183. AfxMessageBox(msg);
  184. return E_FAIL ;
  185. }
  186. CString result;
  187. CElement *root = NULL;
  188. if (parser.LoadXML(receiveBuffer.get(), actualReceived) == 0)
  189. {
  190. root = parser.get_root();
  191. _ASSERTE(root != NULL);
  192. if (root != NULL)
  193. {
  194. result = root->getChildContent(_T("result"));
  195. }
  196. }
  197. if (result.IsEmpty())
  198. {
  199. AfxMessageBox(_T("错误:无法解析服务器响应."));
  200. return E_FAIL;
  201. }
  202. int resultVal = _ttoi(result);
  203. if (resultVal != 0)
  204. {
  205. if (popupMessage == TRUE)
  206. {
  207. CString msg = root->getChildContent(_T("message"));
  208. CString error;
  209. if (msg.IsEmpty() == FALSE)
  210.                 error.Format("%s", msg);
  211. else
  212. error.Format("error = %d", resultVal);
  213. AfxMessageBox(error);
  214. }
  215. return E_FAIL;
  216. }
  217. return S_OK;
  218. }
  219. HRESULT CCommunication::sendQueryUserRequest(LPCTSTR userID)
  220. {
  221. CXMLParser parser;
  222. CElement *root = parser.createElement(_T("REQUEST"), _T(""));
  223. root->AddChild(_T("type"), _T("QUERYUSER"));
  224. root->AddChild(_T("userID"), userID);
  225. parser.set_root(root);
  226. if (parser.BuildXML() != 0)
  227. return E_FAIL;
  228. CString sendOut = parser.get_xml();
  229. int ret = _sock.Send((BYTE*)((LPCTSTR)sendOut), sendOut.GetLength());
  230. if (ret == SOCKET_ERROR)
  231. {
  232. DWORD error = _sock.GetLastError();
  233. TRACE(_T("ERROR: Failed to send the QUERYUSER request (%ld).n"), error);
  234. return E_FAIL;
  235. }
  236. return S_OK;
  237. }
  238. HRESULT CCommunication::sendOnlineRequest(CString userID, u_short port)
  239. {
  240. CXMLParser parser;
  241. CString csPort;
  242. csPort.Format("%d", port);
  243. CElement *root = parser.createElement(_T("REQUEST"), _T(""));
  244. root->AddChild(_T("type"), _T("ONLINE"));
  245. root->AddChild(_T("userID"), userID);
  246. root->AddChild(_T("port"), csPort);
  247. parser.set_root(root);
  248. if (parser.BuildXML() != 0)
  249. return E_FAIL;
  250. CString sendOut = parser.get_xml();
  251. int ret = _sock.Send((BYTE*)((LPCTSTR)sendOut), sendOut.GetLength());
  252. if (ret == SOCKET_ERROR)
  253. {
  254. TRACE("ERROR: Failed to send the ONLINE request.n");
  255. return E_FAIL;
  256. }
  257. return S_OK;
  258. }