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

ICQ/即时通讯

开发平台:

C/C++

  1. // ServerSocket.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "QQSocket.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CQQSocket
  12. CQQSocket::CQQSocket()
  13. {
  14. }
  15. CString CQQSocket::IPAddrToString(const sockaddr_in &addr)
  16. {
  17. CString result;
  18. result.Format("%d.%d.%d.%d", addr.sin_addr.S_un.S_un_b.s_b1,
  19.  addr.sin_addr.S_un.S_un_b.s_b2,
  20.  addr.sin_addr.S_un.S_un_b.s_b3,
  21.  addr.sin_addr.S_un.S_un_b.s_b4);
  22. return result;
  23. }
  24. HRESULT CQQSocket::stringToIPAddr(LPCTSTR serverAddr, sockaddr_in &addr)
  25. {
  26. _ASSERTE(serverAddr != NULL);
  27. if (serverAddr == NULL)
  28. return E_INVALIDARG;
  29. CString addrString = serverAddr;
  30. int pos = 0;
  31. int S_addr_b[4] = {0, 0, 0, 0};
  32. for(int i = 0; i < 4; i++)
  33. {
  34. int oldPos = pos;
  35. pos = addrString.Find(_T('.'), pos);
  36. if (pos == -1)
  37. {
  38. if (i < 3)
  39. return E_FAIL;
  40. else
  41. pos = addrString.GetLength();
  42. }
  43. CString field = addrString.Mid(oldPos, pos - oldPos);
  44. S_addr_b[i] = _ttoi(field);
  45. pos++;
  46. }
  47. ::ZeroMemory(&addr, sizeof(sockaddr_in));
  48. addr.sin_addr.S_un.S_un_b.s_b1 = (BYTE)S_addr_b[0];
  49. addr.sin_addr.S_un.S_un_b.s_b2 = (BYTE)S_addr_b[1];
  50. addr.sin_addr.S_un.S_un_b.s_b3 = (BYTE)S_addr_b[2];
  51. addr.sin_addr.S_un.S_un_b.s_b4 = (BYTE)S_addr_b[3];
  52. addr.sin_family = AF_INET;
  53. return S_OK;
  54. }
  55. CQQSocket::~CQQSocket()
  56. {
  57. }
  58. // Do not edit the following lines, which are needed by ClassWizard.
  59. /*BEGIN_MESSAGE_MAP(CQQSocket, CSocket)
  60. //{{AFX_MSG_MAP(CQQSocket)
  61. //}}AFX_MSG_MAP
  62. END_MESSAGE_MAP()*/
  63. /////////////////////////////////////////////////////////////////////////////
  64. // CQQSocket member functions
  65. BOOL CQQSocket::create(short port)
  66. {
  67. return CSocket::Create(port, SOCK_DGRAM);
  68. }
  69. HRESULT CQQSocket::sendToHost(SOCKADDR *addrHost, BYTE *buffer, INT_PTR bufferSize)
  70. {
  71. _ASSERTE(addrHost != NULL && buffer != NULL);
  72. if (addrHost == NULL || buffer == NULL)
  73. return E_INVALIDARG;
  74. int res = SendTo(buffer,
  75.          bufferSize,
  76.          addrHost,
  77.          sizeof(sockaddr_in));
  78. if(res == SOCKET_ERROR)
  79. {
  80. int error = WSAGetLastError();
  81. TRACE("ERROR: Failed to send the data to the host (%d).n", error);
  82. return E_FAIL;
  83. }
  84. return S_OK;
  85. }
  86. BOOL CQQSocket::receive(void)
  87. {
  88. DWORD dataInBuffer = 0;
  89. BOOL ret = CAsyncSocket::IOCtl(FIONREAD, &dataInBuffer);
  90. if (ret != TRUE)
  91. {
  92. DWORD error = GetLastError();
  93. TRACE("IOCtl() failed (%d)n", error);
  94. return FALSE;
  95. }
  96. if( dataInBuffer == 0 )
  97. return FALSE ;
  98. _receivedIn.RemoveAll();
  99. _receivedIn.SetSize(dataInBuffer);
  100. BYTE *receiveBuffer = _receivedIn.GetData();
  101. _ASSERTE(receiveBuffer != NULL);
  102. if (receiveBuffer == NULL)
  103. return E_UNEXPECTED;
  104. int addrLen = sizeof(sockaddr_in);
  105. ::ZeroMemory(&_addrFrom, addrLen);
  106. int actualReceived = ReceiveFrom(receiveBuffer,
  107. dataInBuffer,
  108. (SOCKADDR*)&_addrFrom,
  109. &addrLen);
  110. if (actualReceived == SOCKET_ERROR)
  111. {
  112. DWORD error = GetLastError();
  113. TRACE("Failed to receive the response (%d).n", error);
  114. return FALSE ;
  115. }
  116. /*
  117. TRACE("MESSAGE: Received %d bytes from %3d.%3d.%3d.%3dn", actualReceived,
  118. _addrFrom.sin_addr.S_un.S_un_b.s_b1,
  119. _addrFrom.sin_addr.S_un.S_un_b.s_b2,
  120. _addrFrom.sin_addr.S_un.S_un_b.s_b3,
  121. _addrFrom.sin_addr.S_un.S_un_b.s_b4);
  122. */
  123. return TRUE;
  124. }