RtpServer.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include "RtpServer.h"
  2. #include <QTcpSocket>
  3. RTPServer::RTPServer(QObject *parent)
  4. : QObject(parent), m_tcpServer(nullptr), m_port(8088)
  5. {
  6. m_logger = spdlog::get("RTPServer");
  7. if (!m_logger)
  8. {
  9. fmt::print("RTPServer: Failed to get logger instance.\n");
  10. return;
  11. }
  12. SPDLOG_LOGGER_INFO(m_logger, "RTPServer initialized on port {}", m_port);
  13. }
  14. RTPServer::~RTPServer()
  15. {
  16. if (m_tcpServer)
  17. {
  18. m_tcpServer->close();
  19. delete m_tcpServer;
  20. m_tcpServer = nullptr;
  21. }
  22. }
  23. /**
  24. * @brief 启动RTP服务
  25. * @param port 监听端口
  26. * @return 成功返回true,失败返回false
  27. */
  28. bool RTPServer::startServer(int port)
  29. {
  30. if(m_tcpServer == nullptr)
  31. {
  32. m_tcpServer = new QTcpServer(this);
  33. }
  34. m_port = port;
  35. if(!m_tcpServer->listen(QHostAddress::Any, m_port))
  36. {
  37. SPDLOG_LOGGER_ERROR(m_logger, "Failed to start RTP server on port {}", m_port);
  38. return false;
  39. }
  40. return true;
  41. }
  42. /* 处理新连接 */
  43. void RTPServer::do_newConnection()
  44. {
  45. QTcpSocket* clientSocket = m_tcpServer->nextPendingConnection();
  46. if (clientSocket == nullptr)
  47. {
  48. SPDLOG_LOGGER_ERROR(m_logger, "Failed to get pending connection.");
  49. return;
  50. }
  51. connect(clientSocket, &QTcpSocket::disconnected, this, &RTPServer::do_disconnect);
  52. connect(clientSocket, &QTcpSocket::readyRead, this, &RTPServer::do_receiveMessage);
  53. SPDLOG_LOGGER_INFO(m_logger, "新的客户端连接: {}", clientSocket->peerAddress().toString().toStdString());
  54. m_listClients.append(clientSocket); // 添加到客户端列表中
  55. }
  56. /* 断开连接 */
  57. void RTPServer::do_disconnect()
  58. {
  59. QTcpSocket* clientSocket = qobject_cast<QTcpSocket*>(sender());
  60. if (clientSocket)
  61. {
  62. SPDLOG_LOGGER_INFO(m_logger, "客户端断开连接: {}", clientSocket->peerAddress().toString().toStdString());
  63. clientSocket->deleteLater();
  64. m_listClients.removeAll(clientSocket);
  65. } else
  66. {
  67. SPDLOG_LOGGER_ERROR(m_logger, "Failed to cast sender to QTcpSocket.");
  68. }
  69. }
  70. /* 接收消息 */
  71. void RTPServer::do_receiveMessage()
  72. {
  73. QTcpSocket* clientSocket = qobject_cast<QTcpSocket*>(sender());
  74. if (clientSocket == nullptr)
  75. {
  76. SPDLOG_LOGGER_ERROR(m_logger, "Failed to cast sender to QTcpSocket.");
  77. return;
  78. }
  79. QByteArray data = clientSocket->readAll();
  80. if (data.isEmpty())
  81. {
  82. SPDLOG_LOGGER_WARN(m_logger, "Received empty data from client: {}", clientSocket->peerAddress().toString().toStdString());
  83. return;
  84. }
  85. /* 处理接收到的数据 */
  86. RtpSendClientInfo_t sendInfo;
  87. sendInfo.clientIP = clientSocket->peerAddress().toString();
  88. sendInfo.clientPort = clientSocket->peerPort();
  89. RtpRecvClientInfo_t* recvInfo = reinterpret_cast<RtpRecvClientInfo_t*>(data.data());
  90. switch(recvInfo->type)
  91. {
  92. case 0: // 登录请求
  93. handleLogin(sendInfo);
  94. break;
  95. case 1: // 心跳请求
  96. handleHeartbeat(sendInfo);
  97. break;
  98. case 2: // 注销请求
  99. handleLogout(sendInfo);
  100. break;
  101. default:
  102. SPDLOG_LOGGER_WARN(m_logger, "来自客户端为止的请求 {}:{}", sendInfo.clientIP.toStdString(), sendInfo.clientPort);
  103. break;
  104. }
  105. }
  106. /* 处理登录请求 */
  107. void RTPServer::handleLogin(RtpSendClientInfo_t& clientInfo)
  108. {
  109. }
  110. /* 处理心跳请求 */
  111. void RTPServer::handleHeartbeat(RtpSendClientInfo_t& clientInfo)
  112. {
  113. }
  114. /* 处理注销请求 */
  115. void RTPServer::handleLogout(RtpSendClientInfo_t& clientInfo)
  116. {
  117. }
  118. /* 获取发送UDP数据的指针 */
  119. bool RTPServer::getSendUdpSocketPtr(SoundCardRoadInfo_t roadID)
  120. {
  121. return true;
  122. }