修改三方通话功能,在发起三方通话时,先保持住主叫,然后再拉回主叫到会议

NetLinkClient.cpp 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #include "stdafx.h"
  2. #include "NetLinkClient.h"
  3. #include "PduEntity.h"
  4. #include "PduEntityHead.h"
  5. #include "NetLinkMgr.h"
  6. CNetLinkClient::CNetLinkClient(CNetLinkMgr* a_pParent) : m_IsMainClient(false), m_pParent(a_pParent),m_FarEndIp(_T("")), m_FarEndPort(0)
  7. {
  8. // 清空SOCKET数据缓冲区
  9. __initBuffer();
  10. }
  11. CNetLinkClient::~CNetLinkClient( void )
  12. {
  13. Close();
  14. }
  15. // CNetLinkClient 成员函数
  16. /*****************************************************************
  17. **【函数名称】 __initBuffer
  18. **【函数功能】 清空SOCKET数据缓冲区
  19. **【参数】
  20. **【返回值】
  21. ****************************************************************/
  22. void CNetLinkClient::__initBuffer( void )
  23. {
  24. m_HasRead = 0; // 已读取的数据缓冲区长度
  25. memset(m_ReadBuffer, 0, PDU_HEAD_LEN + PDU_MAX_DATA_LEN); // 已读取的缓冲区内容
  26. }
  27. /*****************************************************************
  28. **【函数名称】 __sendBuffer
  29. **【函数功能】 发送数据缓冲区
  30. **【参数】 a_Buf[]: 内容
  31. a_BufLen: 长度
  32. **【返回值】
  33. ****************************************************************/
  34. bool CNetLinkClient::__sendBuffer( UCHAR a_Buf[], UINT a_BufLen )
  35. {
  36. UINT HasSend = 0;
  37. while(HasSend < a_BufLen)
  38. {
  39. int len = Send(&a_Buf[HasSend], a_BufLen - HasSend);
  40. switch(len)
  41. {
  42. case 0: // 连接已断开
  43. return false;
  44. case SOCKET_ERROR: // 发送失败
  45. if(GetLastError() != WSAEWOULDBLOCK)
  46. {
  47. return false;
  48. }
  49. Sleep(10); // 阻塞
  50. break;
  51. default:
  52. HasSend += len;
  53. break;
  54. } // end switch
  55. } // end while
  56. return true;
  57. }
  58. /*****************************************************************
  59. **【函数名称】 OnReceive
  60. **【函数功能】 消息接收事件
  61. **【参数】
  62. **【返回值】
  63. ****************************************************************/
  64. void CNetLinkClient::OnReceive( int ErrorCode )
  65. {
  66. // 读数据
  67. int nRead = Receive(&m_ReadBuffer[m_HasRead], PDU_HEAD_LEN + PDU_MAX_DATA_LEN - m_HasRead);
  68. if(nRead == SOCKET_ERROR)
  69. return;
  70. // 对接收的数据进行处理
  71. m_HasRead += nRead;
  72. // 如果已经接收到完整的包头
  73. while(m_HasRead > PDU_HEAD_LEN) // 有可能一次接收到多个完整命令
  74. {
  75. CPduEntityHead pduHead;
  76. // 解析PDU数据包头
  77. if(!pduHead.Decode(m_ReadBuffer))
  78. {
  79. __initBuffer(); // 如果解析失败,清除缓冲区
  80. break;
  81. } // end if
  82. // 如果数据包完整(HEAD + DATA)
  83. if(m_HasRead >= (PDU_HEAD_LEN + pduHead.GetDataLen()))
  84. {
  85. // 拷贝当前要处理的数据到临时缓冲区
  86. UCHAR szTmpBuf[PDU_MAX_DATA_LEN];
  87. ZeroMemory(szTmpBuf, PDU_MAX_DATA_LEN);
  88. memcpy_s(szTmpBuf, PDU_MAX_DATA_LEN, m_ReadBuffer, PDU_HEAD_LEN + pduHead.GetDataLen());
  89. // 清除已处理的数据(数据前移)
  90. m_HasRead = m_HasRead - (PDU_HEAD_LEN + pduHead.GetDataLen());
  91. memcpy(m_ReadBuffer, &m_ReadBuffer[PDU_HEAD_LEN + pduHead.GetDataLen()], m_HasRead);
  92. memset(&m_ReadBuffer[m_HasRead], 0, (PDU_HEAD_LEN + PDU_MAX_DATA_LEN - m_HasRead));
  93. // 对数据进行处理
  94. CPduEntity pduEntity(&pduHead, &szTmpBuf[PDU_HEAD_LEN]);
  95. pduEntity.assoClient() = this;
  96. ASSERT(m_pParent != NULL);
  97. m_pParent->onCmdRequest(this, &pduEntity);
  98. }
  99. else
  100. {
  101. break; // 如果当前数据不是一个完整数据包,退出循环
  102. } // end if
  103. } // end while
  104. CAsyncSocket::OnReceive(ErrorCode);
  105. }
  106. /*****************************************************************
  107. **【函数名称】 OnConnect
  108. **【函数功能】 消息连接事件
  109. **【参数】
  110. **【返回值】
  111. ****************************************************************/
  112. void CNetLinkClient::OnConnect( int ErrorCode )
  113. {
  114. GetPeerName(m_FarEndIp, m_FarEndPort);
  115. }
  116. /*****************************************************************
  117. **【函数名称】 OnClose
  118. **【函数功能】 关闭事件
  119. **【参数】
  120. **【返回值】
  121. ****************************************************************/
  122. void CNetLinkClient::OnClose( int ErrorCode )
  123. {
  124. // 必要操作
  125. Close();
  126. ASSERT(m_pParent != NULL);
  127. m_pParent->onClientDisconnect(this); // 连接断开
  128. CAsyncSocket::OnClose(ErrorCode);
  129. }
  130. /*****************************************************************
  131. **【函数名称】 send
  132. **【函数功能】 发送PDU命令
  133. **【参数】 a_Pdu: 要发送的命令
  134. **【返回值】
  135. ****************************************************************/
  136. bool CNetLinkClient::send( CPduEntity& a_Pdu )
  137. {
  138. a_Pdu.SetPeerDevInfo(m_PeerType, m_PeerId); // 填充接收方信息
  139. // 生成要发送的数据缓冲区
  140. UCHAR Buf[PDU_HEAD_LEN + PDU_MAX_DATA_LEN];
  141. ZeroMemory(Buf, PDU_HEAD_LEN + PDU_MAX_DATA_LEN);
  142. int nLen = a_Pdu.CreatePackge(Buf);
  143. // 发送
  144. return __sendBuffer(Buf, nLen);
  145. }
  146. /*****************************************************************
  147. **【函数名称】 setPeerInfo
  148. **【函数功能】 设置对端类型信息
  149. **【参数】
  150. **【返回值】
  151. ****************************************************************/
  152. void CNetLinkClient::setPeerInfo( PDU_DEV_TYPE a_DevType, int a_DevId )
  153. {
  154. m_PeerType = a_DevType;
  155. m_PeerId = a_DevId;
  156. }