RtpServer.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. #include "RtpServer.h"
  2. #include <QTcpSocket>
  3. #include "ThreadManager.h"
  4. RTPServer::RTPServer(QObject *parent)
  5. : QObject(parent), m_tcpServer(nullptr), m_port(8808)
  6. {
  7. }
  8. RTPServer::~RTPServer()
  9. {
  10. if (m_tcpServer)
  11. {
  12. m_tcpServer->close();
  13. delete m_tcpServer;
  14. m_tcpServer = nullptr;
  15. }
  16. }
  17. /**
  18. * @brief 启动RTP服务
  19. * @param port 监听端口
  20. * @return 成功返回true,失败返回false
  21. */
  22. bool RTPServer::thread_task(int port)
  23. {
  24. m_logger = spdlog::get("RTPServer");
  25. if (!m_logger)
  26. {
  27. fmt::print("RTPServer: Failed to get logger instance.\n");
  28. return false;
  29. }
  30. SPDLOG_LOGGER_INFO(m_logger, "♫ 开启 RTPServer 服务线程");
  31. if(m_tcpServer == nullptr)
  32. {
  33. m_tcpServer = new QTcpServer(this);
  34. }
  35. m_port = port;
  36. if(!m_tcpServer->listen(QHostAddress::Any, m_port))
  37. {
  38. SPDLOG_LOGGER_ERROR(m_logger, "Failed to start RTP server on port {}", m_port);
  39. SPDLOG_LOGGER_ERROR(m_logger, "错误信息: {}", m_tcpServer->errorString().toStdString());
  40. return false;
  41. }
  42. /* 开启事件循环 */
  43. connect(m_tcpServer, &QTcpServer::newConnection, this, &RTPServer::do_newConnection);
  44. connect(m_tcpServer, &QTcpServer::acceptError, this, &RTPServer::do_error);
  45. m_isStoped.store(false);
  46. m_eventLoop.exec();
  47. m_isStoped.store(true);
  48. SPDLOG_LOGGER_INFO(m_logger, "♫ RTPServer 线程结束运行");
  49. return true;
  50. }
  51. /* 停止线程 */
  52. void RTPServer::stopThreadBlock()
  53. {
  54. if(m_eventLoop.isRunning())
  55. {
  56. m_eventLoop.quit();
  57. }
  58. while(!m_isStoped.load())
  59. {
  60. std::this_thread::sleep_for(std::chrono::milliseconds(10));
  61. }
  62. }
  63. /* 处理新连接 */
  64. void RTPServer::do_newConnection()
  65. {
  66. QTcpSocket* clientSocket = m_tcpServer->nextPendingConnection();
  67. if (clientSocket == nullptr)
  68. {
  69. SPDLOG_LOGGER_ERROR(m_logger, "Failed to get pending connection.");
  70. return;
  71. }
  72. connect(clientSocket, &QTcpSocket::disconnected, this, &RTPServer::do_disconnect);
  73. connect(clientSocket, &QTcpSocket::readyRead, this, &RTPServer::do_receiveMessage);
  74. SPDLOG_LOGGER_INFO(m_logger, "新的客户端连接: {}", clientSocket->peerAddress().toString().toStdString());
  75. m_listClients.append(clientSocket); // 添加到客户端列表中
  76. }
  77. /* 监听服务错误 */
  78. void RTPServer::do_error(QAbstractSocket::SocketError socketError)
  79. {
  80. SPDLOG_LOGGER_ERROR(m_logger, "RTP Server error: {}, {}", static_cast<int>(socketError), m_tcpServer->errorString().toStdString());
  81. }
  82. /* 断开连接 */
  83. void RTPServer::do_disconnect()
  84. {
  85. QTcpSocket* clientSocket = qobject_cast<QTcpSocket*>(sender());
  86. if (clientSocket)
  87. {
  88. SPDLOG_LOGGER_INFO(m_logger, "客户端断开连接: {}", clientSocket->peerAddress().toString().toStdString());
  89. clientSocket->deleteLater();
  90. m_listClients.removeAll(clientSocket);
  91. } else
  92. {
  93. SPDLOG_LOGGER_ERROR(m_logger, "Failed to cast sender to QTcpSocket.");
  94. }
  95. }
  96. /* 接收消息 */
  97. void RTPServer::do_receiveMessage()
  98. {
  99. QTcpSocket* clientSocket = qobject_cast<QTcpSocket*>(sender());
  100. if (clientSocket == nullptr)
  101. {
  102. SPDLOG_LOGGER_ERROR(m_logger, "Failed to cast sender to QTcpSocket.");
  103. return;
  104. }
  105. QByteArray data = clientSocket->readAll();
  106. if (data.isEmpty())
  107. {
  108. SPDLOG_LOGGER_WARN(m_logger, "Received empty data from client: {}", clientSocket->peerAddress().toString().toStdString());
  109. return;
  110. }
  111. SPDLOG_LOGGER_TRACE(m_logger, "RTPServer从: {}:{} 接收到原始数据: {}, 大小: {}",
  112. clientSocket->peerAddress().toString().toStdString(), clientSocket->peerPort(),
  113. data.toHex().toStdString(), data.size());
  114. // SPDLOG_LOGGER_TRACE(m_logger, "RTPServer从: {}:{} 接收到数据: {}",
  115. // clientSocket->peerAddress().toString().toStdString(), clientSocket->peerPort(),
  116. // QString(data).toStdString());
  117. // return;
  118. if(data.size() < sizeof(RtpRecvClientInfo_t))
  119. {
  120. SPDLOG_LOGGER_WARN(m_logger, "从客户端接收到的数据大小: {} 低于应有的大小 {}",
  121. clientSocket->peerAddress().toString().toStdString(), sizeof(RtpRecvClientInfo_t));
  122. return;
  123. }
  124. /* 处理接收到的数据 */
  125. RtpSendClientInfo_t sendInfo;
  126. QString clientIP = clientSocket->peerAddress().toString();
  127. quint16 clientPort = clientSocket->peerPort();
  128. RtpRecvClientInfo_t* recvInfo = reinterpret_cast<RtpRecvClientInfo_t*>(data.data());
  129. SPDLOG_LOGGER_DEBUG(m_logger, "客户端信息: ");
  130. SPDLOG_LOGGER_DEBUG(m_logger, " 客户端IP: {}", recvInfo->clientIP);
  131. SPDLOG_LOGGER_DEBUG(m_logger, " 客户端端口: {}", recvInfo->clientPort);
  132. SPDLOG_LOGGER_DEBUG(m_logger, " 对比项ID: {}", recvInfo->compareItemID);
  133. SPDLOG_LOGGER_DEBUG(m_logger, " 对比项通道号: {}", recvInfo->compareItemRoadNum);
  134. SPDLOG_LOGGER_DEBUG(m_logger, " 客户端名称: {}", recvInfo->sessionName);
  135. SPDLOG_LOGGER_DEBUG(m_logger, " 包类型: {}", recvInfo->type);
  136. /* 解析客户端发送的信息 */
  137. sendInfo.clientIP = clientIP;
  138. sendInfo.clientPort = clientPort;
  139. /* 查找本地可用的UDP端口,这里先使用10010测试 */
  140. sendInfo.localPort = 10010;
  141. switch(recvInfo->type)
  142. {
  143. case 0: // 登录请求
  144. handleLogin(sendInfo);
  145. break;
  146. case 1: // 心跳请求
  147. handleHeartbeat(sendInfo);
  148. break;
  149. case 2: // 注销请求
  150. handleLogout(sendInfo);
  151. break;
  152. default:
  153. SPDLOG_LOGGER_WARN(m_logger, "来自客户端为止的请求 {}:{}", sendInfo.clientIP.toStdString(), sendInfo.clientPort);
  154. break;
  155. }
  156. }
  157. /* 处理登录请求 */
  158. void RTPServer::handleLogin(RtpSendClientInfo_t& clientInfo)
  159. {
  160. /* 获取RTP发送线程 */
  161. }
  162. /* 处理心跳请求 */
  163. void RTPServer::handleHeartbeat(RtpSendClientInfo_t& clientInfo)
  164. {
  165. }
  166. /* 处理注销请求 */
  167. void RTPServer::handleLogout(RtpSendClientInfo_t& clientInfo)
  168. {
  169. }
  170. /* 获取发送UDP数据的指针 */
  171. bool RTPServer::getSendUdpSocketPtr(SoundCardRoadInfo_t roadID)
  172. {
  173. return true;
  174. }