NetworkStub.cpp
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:6k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19. #include "stdafx.h"
  20. #include "NetWorkStub.h"
  21. #include "ChannelMgr.h"
  22. #include <string>
  23. using namespace std;
  24. #ifdef USE_LOG
  25. FILE* log = NULL;
  26. #pragma message("will generate log for networkstub")
  27. #endif
  28. NetworkStub::NetworkStub()
  29. : mainThread(NULL), sock(NULL), chnnMgr(NULL) //log("#NetworkStub")
  30. {
  31. }
  32. NetworkStub::~NetworkStub()
  33. {
  34. if(mainThread)
  35. {
  36. closesocket(sock);
  37. if( WaitForSingleObject(mainThread, 3000) != WAIT_OBJECT_0 )
  38. {
  39. // 如果超过3秒还没退出,再Terminate
  40. TerminateThread(mainThread, 1L);
  41. }
  42. CloseHandle(mainThread);
  43. }
  44. #ifdef USE_LOG
  45. if(log) fclose(log);
  46. #endif
  47. }
  48. // 初始化,并启动新线程处理socket消息
  49. bool NetworkStub::Init( SOCKET sockFromProxy, CChannelMgr* chnnMgr )
  50. {
  51. unsigned int threadID;
  52. this->sock = sockFromProxy;
  53. this->chnnMgr = chnnMgr;
  54. mainThread = (HANDLE) _beginthreadex(NULL, 0, &_ThreadFunc, this, 0, &threadID);
  55. if( ! mainThread )
  56. return false;
  57. return true;
  58. }
  59. // Thread function
  60. unsigned int CALLBACK NetworkStub::_ThreadFunc(void* arg)
  61. {
  62. NetworkStub* pThis = (NetworkStub*)arg;
  63. // data for getData
  64. PBYTE pData = NULL;
  65. // Run
  66. pThis->_ProcessProxy(pData);
  67. //chnnMgr->Stop() should be called.
  68. if(pThis->chnnMgr)
  69. pThis->chnnMgr->Stop();
  70. //release resources
  71. if(pData)
  72. free(pData);
  73. return 0;
  74. }
  75. void NetworkStub::_ProcessProxy(PBYTE& pData)
  76. {
  77. // tcp client
  78. TCPClient proxyTcp(sock);
  79. // first 6 bytes of each msg
  80. UINT8 msgType, subMsgType;
  81. UINT length;
  82. PBYTE data;
  83. // current length of pData
  84. UINT curDataLen = 0;
  85. // main loop: parse message.
  86. // return immdiately if error occur or receive stop message.
  87. PSTREAM s = proxyTcp.InitData(1024);
  88. while( s = proxyTcp.Recv(NULL, 6) )
  89. {
  90. in_uint8(s, msgType);
  91. in_uint8(s, subMsgType);
  92. in_uint32_be(s, length);
  93. switch(msgType){ //response to each type
  94. case MSG_REQUEST:
  95. {
  96. UINT8 retvalue = 0;
  97. if( length > 0 )
  98. {
  99. s = proxyTcp.Recv(s, length);
  100. if(!s)
  101. return;
  102. in_uint8p(s, data, length);
  103. retvalue = chnnMgr->Request((LPCTSTR)data) ? 1 : 0;
  104. }
  105. #ifdef USE_LOG
  106. if( !log )
  107. log = fopen("TestStub.txt", "w+");
  108. fprintf(log, "recv request: %s, %dn", (LPCTSTR)data, length);
  109. #endif
  110. if( ! proxyTcp.SendEx(MSG_REQUEST, retvalue, NULL, 0) )
  111. return;
  112. #ifdef USE_LOG
  113. fprintf(log, "send response: type %dnn", MSG_REQUEST);
  114. #endif
  115. }
  116. break;
  117. case MSG_SENDMSGTOSHOW:
  118. {
  119. in_uint8p(s, data, length); 
  120. #ifdef USE_LOG
  121. fprintf(log, "recv sendmsgtoshow: %sn", (LPCTSTR)data);
  122. #endif
  123. chnnMgr->SendMsgToShow((LPCTSTR)data, length);
  124. if( ! proxyTcp.SendEx(MSG_SENDMSGTOSHOW, 0, NULL, length) )
  125. return;
  126. #ifdef USE_LOG
  127. fprintf(log, "send response: type %dnn", MSG_SENDMSGTOSHOW);
  128. #endif
  129. }
  130. break;
  131. case MSG_STOP:
  132. {
  133. #ifdef USE_LOG
  134. fprintf(log, "recv stop.nn");
  135. #endif
  136. }
  137. return; // return if receive stop msg. chnnMgr->Stop() will be called later
  138. case MSG_GETDATA:
  139. {
  140. bool needGet = true; // whether need to GetData from chnnMgr
  141. if( length != sizeof(UINT) )
  142. needGet = false; // error
  143. bool bAudio = (subMsgType & 0x2) ? true : false;
  144. bool bKeySample = (subMsgType & 0x1) ? true : false;
  145. s = proxyTcp.Recv(s, sizeof(UINT));
  146. if(!s)
  147. return;
  148. in_uint8p(s, data, sizeof(UINT));
  149. UINT maxSize = *((UINT*)data);
  150. if( maxSize==0 ) 
  151. needGet = false;
  152. #ifdef USE_LOG
  153. fprintf(log, "recv getdata: bAudio %d, bKeySample %d, maxSize:%un", bAudio?1:0, bKeySample?1:0, maxSize);
  154. #endif
  155. if( !pData || curDataLen<maxSize )
  156. {
  157. curDataLen = maxSize;
  158. pData = (PBYTE)realloc(pData, maxSize);
  159. if( !pData )
  160. needGet = false;
  161. }
  162. int ret = -1; 
  163. SampleHeader header;
  164. if( needGet )
  165. ret = chnnMgr->GetData(header, pData, maxSize, bAudio, bKeySample);
  166. // send response to proxy
  167. UINT8 retValue; // subMsgType of response to proxy 
  168. if( ret > 0 ) // 成功
  169. {
  170. retValue = 1;
  171. if( ! proxyTcp.SendEx2(MSG_GETDATA, retValue, (PBYTE)&header, sizeof(SampleHeader), pData, header.size ) )
  172. return;
  173. #ifdef USE_LOG
  174. fprintf(log, "send response: type %d, subType %u, headerlen %u, datalen %un", MSG_GETDATA, retValue, sizeof(SampleHeader), header.size);
  175. // header
  176. fprintf(log, "header: %u, %u, %u, %u, %u, %u, %I64dn", header.size, header.bDiscontinuity, header.bPreroll, header.bSyncPoint, header.bAudioSample, header.length, header.start);
  177. // data
  178. UINT i=0; string datastr = "data: "; char tmp[16];
  179. for( i=0; i<header.size; i++){
  180. itoa(pData[i], tmp, 10);
  181. datastr.append( tmp );
  182. datastr.append( " " );
  183. }
  184. fprintf(log, "%snn", datastr.data() );
  185. #endif
  186. }
  187. else if( ret==0 ) //暂时没有数据
  188. {
  189. retValue = 0;
  190. if( ! proxyTcp.SendEx2(MSG_GETDATA, retValue, NULL, 0, NULL, 0) )
  191. return;
  192. #ifdef USE_LOG
  193. fprintf(log, "send response: type %d, subType %un", MSG_GETDATA, retValue);
  194. #endif
  195. }
  196. else // 错误
  197. {
  198. retValue = -1;
  199. if( ! proxyTcp.SendEx2(MSG_GETDATA, retValue, NULL, 0, NULL, 0) )
  200. // proxyTcp.SendEx2(MSG_GETDATA, retValue, NULL, 0, NULL, 0);
  201. return;
  202. #ifdef USE_LOG
  203. fprintf(log, "send response: type %d, subType %un", MSG_GETDATA, retValue);
  204. #endif
  205. }
  206. }
  207. break;
  208. }
  209. }
  210. }