CMediaSocketServer.cpp
上传用户:hhs829
上传日期:2022-06-17
资源大小:586k
文件大小:4k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. // 
  2. // CMediaSocketServer.cpp
  3. // 
  4. #include "stdafx.h"
  5. #include "CMediaSocketServer.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. //////////////////////////////////////////////////////////////////////////////
  12. CMediaSocketServer::CMediaSocketServer()
  13. {
  14. m_strSourceFile = "";
  15. m_bReadyToSend  = false;
  16. m_lBytesSent    = 0;
  17. }
  18. CMediaSocketServer::~CMediaSocketServer()
  19. {
  20. m_bSending   = false;
  21. m_bReceiving = false;
  22. }
  23. void CMediaSocketServer::SetSourceFile(const char * inPath)
  24. {
  25. bool   bBackup = m_bReadyToSend;
  26. if (m_strSourceFile != "")
  27. {
  28. // Pause the sending thread
  29. m_bReadyToSend = false;
  30. Sleep(100);
  31. m_objFile.Close();
  32. }
  33. m_strSourceFile = inPath;
  34. // Open source file successfully
  35. if (m_objFile.Open(m_strSourceFile, CFile::modeRead | CFile::typeBinary))
  36. {
  37. m_lBytesSent    = 0;
  38. m_bReadyToSend  = bBackup;
  39. }
  40. }
  41. // Send the source file data once again!!!
  42. void CMediaSocketServer::SendAtOnce(void)
  43. {
  44. m_lBytesSent   = 0;
  45. m_bReadyToSend = true;
  46. // If sending thread has not been started, start it at once
  47. StartSending();
  48. }
  49. // Receiving blockingly
  50. void CMediaSocketServer::ReceivingLoop(void)
  51. {
  52. int    nret     = 0;
  53. int    nMsgType = 0;
  54. int    nDataLen = 0;
  55. char   buff[sizeof(MSG_HEADER) + MPEG1_PACK];
  56. while (m_bReceiving)
  57. {
  58. // Receive the message header
  59. while ((nret = Receive(buff, sizeof(MSG_HEADER))) == E_SOCKET_NOT_READY)
  60. {
  61. Sleep(100);
  62. }
  63. // When errors occur or socket closed, terminate this loop
  64. if (nret == E_SOCKET_FAIL || nret == E_SOCKET_CLOSE)
  65. break;
  66. // See what type the payload is...
  67. PMSG_HEADER  pMsg = (PMSG_HEADER) buff;
  68. nMsgType = pMsg->nMsgType;   // Payload type retrieved
  69. nDataLen = pMsg->nDataSize;  // Payload size retrieved
  70. // Continue to receive the payload
  71. if (nDataLen > 0)
  72. {
  73. while ((nret = Receive(buff, nDataLen)) == E_SOCKET_NOT_READY)
  74. {
  75. Sleep(100);
  76. }
  77. // When errors occur or socket closed, terminate this loop
  78. if (nret == E_SOCKET_FAIL || nret == E_SOCKET_CLOSE)
  79. break;
  80. }
  81. // Data processing
  82. switch (nMsgType)
  83. {
  84. case DATA_REQUEST: // The remote request to data sending
  85. if (!m_bReadyToSend)
  86. {
  87. SendAtOnce();
  88. }
  89. break;
  90. case DATA_REFUSED: // Stop current data sending
  91. if (m_bReadyToSend)
  92. {
  93. m_bReadyToSend = false;
  94. }
  95. break;
  96. case RECV_EXIT_REQUEST: // Send message to stop client receiving
  97. {
  98. char pData[sizeof(MSG_HEADER)];
  99. PMSG_HEADER pMsg = (PMSG_HEADER) pData;
  100. pMsg->nDataSize  = 0;
  101. pMsg->nMsgType   = RECV_EXIT;
  102. Send(pData, sizeof(MSG_HEADER));
  103. break;
  104. }
  105. case DISCONNECT_REQUEST: // The remote request disconnect
  106. // Stop sending thread first
  107. StopSending();
  108. // Close the socket connection
  109. if (m_hSocket)
  110. {
  111. closesocket(m_hSocket);
  112. m_hSocket = NULL;
  113. }
  114. return ; // Terminate this receiving thread
  115. default:
  116. break;
  117. }
  118. }
  119. }
  120. // Sending cycle
  121. void CMediaSocketServer::SendingLoop(void)
  122. {
  123. int       nRead    = 0;
  124. const int nMsgSize = sizeof(MSG_HEADER) + MPEG1_PACK;
  125. char *    pBuf     = new char[nMsgSize];
  126. // Make message header
  127. PMSG_HEADER  pMsg = (PMSG_HEADER) pBuf;
  128. pMsg->nMsgType  = DATA_MEDIA;
  129. pMsg->nDataSize = MPEG1_PACK;
  130. while (m_bSending)
  131. {
  132. // Not ready to send just this time!!!
  133. if (!m_bReadyToSend)
  134. {
  135. Sleep(100);
  136. continue;
  137. }
  138. // Read from file and send a pack every time
  139. if (m_objFile.Seek(m_lBytesSent, CFile::begin) == m_lBytesSent)
  140. {
  141. nRead = m_objFile.Read(pBuf + sizeof(MSG_HEADER), MPEG1_PACK);
  142. // Maybe meet the end of file
  143. if (nRead < MPEG1_PACK)
  144. {
  145. // Modify the payload's size
  146. // pMsg->nDataSize = nRead;
  147. // Send(pBuf, sizeof(MSG_HEADER) + nRead);
  148. // m_lBytesSent  += nRead;
  149. m_bReadyToSend = false;
  150. // Reset to send again
  151. // m_lBytesSent = 0;
  152. }
  153. else
  154. {
  155. Send(pBuf, nMsgSize);
  156. // Don't send data too fast!!!
  157. Sleep(20);
  158. m_lBytesSent += MPEG1_PACK;
  159. }
  160. }
  161. else
  162. {
  163. // Maybe meet the end of file
  164. m_bReadyToSend = false;
  165. }
  166. }
  167. delete []pBuf;
  168. }