ListenServer.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:2k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // ListenServer.cpp: implementation of the CListenServer class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "testbt.h"
  6. #include "ListenServer.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CListenServer::CListenServer()
  16. {
  17. m_hServer = INVALID_SOCKET;
  18. m_hevAccept = 0;
  19. m_hnewSocket = INVALID_SOCKET;
  20. }
  21. CListenServer::~CListenServer()
  22. {
  23. if (m_hServer)
  24. {
  25. closesocket(m_hServer);
  26. if (m_hevAccept)
  27. WaitForSingleObject(m_hevAccept, INFINITE);
  28. }
  29. }
  30. void CListenServer::StopListening()
  31. {
  32. }
  33. CListenServer::operator SOCKET()
  34. {
  35. return m_hServer;
  36. }
  37. long CListenServer::Bind(long lminport, long lmaxport)
  38. {
  39. SOCKET hserver = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, WSA_FLAG_OVERLAPPED);
  40. if (hserver == INVALID_SOCKET)
  41. return false;
  42. long lport = 0;
  43. int iRet = -1;
  44. sockaddr_in addr = {0};
  45. addr.sin_family = AF_INET;
  46. for (lport=lminport; lport<=lmaxport; lport++)
  47. {
  48. addr.sin_port = lport;
  49. iRet = bind(hserver, (sockaddr*)&addr, sizeof(addr));
  50. if (iRet  == 0)
  51. break;
  52. else
  53. {
  54. // string strErr = WSAShowError();
  55. // errorFunc("bind() server error:bind to port error: " + WSAShowError());
  56. }
  57. }
  58. if (iRet != 0)
  59. return false;
  60. iRet = listen(hserver, 10);
  61. if (iRet != 0)
  62. return false;
  63. m_hServer = hserver;
  64. return lport;
  65. }
  66. bool CListenServer::Accept(HANDLE hevAccept)
  67. {
  68. if (m_hevAccept || m_hServer == INVALID_SOCKET)
  69. {
  70. assert(false);
  71. return false;
  72. }
  73. m_hevAccept = hevAccept;
  74. DWORD dwThreadId = 0;
  75. ::CreateThread(0, 0, ListenProc, this, 0, &dwThreadId);
  76. TRACE("rnlisten thread = (%x)", dwThreadId);
  77. return true;
  78. }
  79. DWORD WINAPI CListenServer::ListenProc(void *pParam)
  80. {
  81. CListenServer* pListenServer = (CListenServer*) pParam;
  82. pListenServer->Listening();
  83. return 0;
  84. }
  85. void CListenServer::Listening()
  86. {
  87. CWinsockInit();
  88. sockaddr_in addr = {0};
  89. int iaddrlen = sizeof(addr);
  90. m_hnewSocket = WSAAccept(m_hServer, (sockaddr *)&addr, &iaddrlen, 0, 0);
  91. if (m_hnewSocket == INVALID_SOCKET)
  92. {
  93. string strErr = WSAShowError();
  94. }
  95. SetEvent(m_hevAccept);
  96. }
  97. SOCKET CListenServer::GetResult()
  98. {
  99. m_hevAccept = 0;
  100. return m_hnewSocket;
  101. }