#include "RtpServer.h" #include RTPServer::RTPServer(QObject *parent) : QObject(parent), m_tcpServer(nullptr), m_port(8088) { m_logger = spdlog::get("RTPServer"); if (!m_logger) { fmt::print("RTPServer: Failed to get logger instance.\n"); return; } SPDLOG_LOGGER_INFO(m_logger, "RTPServer initialized on port {}", m_port); } RTPServer::~RTPServer() { if (m_tcpServer) { m_tcpServer->close(); delete m_tcpServer; m_tcpServer = nullptr; } } /** * @brief 启动RTP服务 * @param port 监听端口 * @return 成功返回true,失败返回false */ bool RTPServer::startServer(int port) { if(m_tcpServer == nullptr) { m_tcpServer = new QTcpServer(this); } m_port = port; if(!m_tcpServer->listen(QHostAddress::Any, m_port)) { SPDLOG_LOGGER_ERROR(m_logger, "Failed to start RTP server on port {}", m_port); return false; } return true; } /* 处理新连接 */ void RTPServer::do_newConnection() { QTcpSocket* clientSocket = m_tcpServer->nextPendingConnection(); if (clientSocket == nullptr) { SPDLOG_LOGGER_ERROR(m_logger, "Failed to get pending connection."); return; } connect(clientSocket, &QTcpSocket::disconnected, this, &RTPServer::do_disconnect); connect(clientSocket, &QTcpSocket::readyRead, this, &RTPServer::do_receiveMessage); SPDLOG_LOGGER_INFO(m_logger, "新的客户端连接: {}", clientSocket->peerAddress().toString().toStdString()); m_listClients.append(clientSocket); // 添加到客户端列表中 } /* 断开连接 */ void RTPServer::do_disconnect() { QTcpSocket* clientSocket = qobject_cast(sender()); if (clientSocket) { SPDLOG_LOGGER_INFO(m_logger, "客户端断开连接: {}", clientSocket->peerAddress().toString().toStdString()); clientSocket->deleteLater(); m_listClients.removeAll(clientSocket); } else { SPDLOG_LOGGER_ERROR(m_logger, "Failed to cast sender to QTcpSocket."); } } /* 接收消息 */ void RTPServer::do_receiveMessage() { QTcpSocket* clientSocket = qobject_cast(sender()); if (clientSocket == nullptr) { SPDLOG_LOGGER_ERROR(m_logger, "Failed to cast sender to QTcpSocket."); return; } QByteArray data = clientSocket->readAll(); if (data.isEmpty()) { SPDLOG_LOGGER_WARN(m_logger, "Received empty data from client: {}", clientSocket->peerAddress().toString().toStdString()); return; } /* 处理接收到的数据 */ RtpSendClientInfo_t sendInfo; sendInfo.clientIP = clientSocket->peerAddress().toString(); sendInfo.clientPort = clientSocket->peerPort(); RtpRecvClientInfo_t* recvInfo = reinterpret_cast(data.data()); switch(recvInfo->type) { case 0: // 登录请求 handleLogin(sendInfo); break; case 1: // 心跳请求 handleHeartbeat(sendInfo); break; case 2: // 注销请求 handleLogout(sendInfo); break; default: SPDLOG_LOGGER_WARN(m_logger, "来自客户端为止的请求 {}:{}", sendInfo.clientIP.toStdString(), sendInfo.clientPort); break; } } /* 处理登录请求 */ void RTPServer::handleLogin(RtpSendClientInfo_t& clientInfo) { } /* 处理心跳请求 */ void RTPServer::handleHeartbeat(RtpSendClientInfo_t& clientInfo) { } /* 处理注销请求 */ void RTPServer::handleLogout(RtpSendClientInfo_t& clientInfo) { } /* 获取发送UDP数据的指针 */ bool RTPServer::getSendUdpSocketPtr(SoundCardRoadInfo_t roadID) { return true; }