#include "RtpServer.h" #include #include "ThreadManager.h" RTPServer::RTPServer(QObject *parent) : QObject(parent), m_tcpServer(nullptr), m_port(8808) { } RTPServer::~RTPServer() { if (m_tcpServer) { m_tcpServer->close(); delete m_tcpServer; m_tcpServer = nullptr; } } /** * @brief 启动RTP服务 * @param port 监听端口 * @return 成功返回true,失败返回false */ bool RTPServer::thread_task(int port) { m_logger = spdlog::get("RTPServer"); if (!m_logger) { fmt::print("RTPServer: Failed to get logger instance.\n"); return false; } SPDLOG_LOGGER_INFO(m_logger, "♫ 开启 RTPServer 服务线程"); 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); SPDLOG_LOGGER_ERROR(m_logger, "错误信息: {}", m_tcpServer->errorString().toStdString()); return false; } /* 开启事件循环 */ connect(m_tcpServer, &QTcpServer::newConnection, this, &RTPServer::do_newConnection); connect(m_tcpServer, &QTcpServer::acceptError, this, &RTPServer::do_error); m_isStoped.store(false); m_eventLoop.exec(); m_isStoped.store(true); SPDLOG_LOGGER_INFO(m_logger, "♫ RTPServer 线程结束运行"); return true; } /* 停止线程 */ void RTPServer::stopThreadBlock() { if(m_eventLoop.isRunning()) { m_eventLoop.quit(); } while(!m_isStoped.load()) { std::this_thread::sleep_for(std::chrono::milliseconds(10)); } } /* 处理新连接 */ 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_error(QAbstractSocket::SocketError socketError) { SPDLOG_LOGGER_ERROR(m_logger, "RTP Server error: {}, {}", static_cast(socketError), m_tcpServer->errorString().toStdString()); } /* 断开连接 */ 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; } SPDLOG_LOGGER_TRACE(m_logger, "RTPServer从: {}:{} 接收到原始数据: {}, 大小: {}", clientSocket->peerAddress().toString().toStdString(), clientSocket->peerPort(), data.toHex().toStdString(), data.size()); // SPDLOG_LOGGER_TRACE(m_logger, "RTPServer从: {}:{} 接收到数据: {}", // clientSocket->peerAddress().toString().toStdString(), clientSocket->peerPort(), // QString(data).toStdString()); // return; if(data.size() < sizeof(RtpRecvClientInfo_t)) { SPDLOG_LOGGER_WARN(m_logger, "从客户端接收到的数据大小: {} 低于应有的大小 {}", clientSocket->peerAddress().toString().toStdString(), sizeof(RtpRecvClientInfo_t)); return; } /* 处理接收到的数据 */ RtpSendClientInfo_t sendInfo; QString clientIP = clientSocket->peerAddress().toString(); quint16 clientPort = clientSocket->peerPort(); RtpRecvClientInfo_t* recvInfo = reinterpret_cast(data.data()); SPDLOG_LOGGER_DEBUG(m_logger, "客户端信息: "); SPDLOG_LOGGER_DEBUG(m_logger, " 客户端IP: {}", recvInfo->clientIP); SPDLOG_LOGGER_DEBUG(m_logger, " 客户端端口: {}", recvInfo->clientPort); SPDLOG_LOGGER_DEBUG(m_logger, " 对比项ID: {}", recvInfo->compareItemID); SPDLOG_LOGGER_DEBUG(m_logger, " 对比项通道号: {}", recvInfo->compareItemRoadNum); SPDLOG_LOGGER_DEBUG(m_logger, " 客户端名称: {}", recvInfo->sessionName); SPDLOG_LOGGER_DEBUG(m_logger, " 包类型: {}", recvInfo->type); /* 解析客户端发送的信息 */ sendInfo.clientIP = clientIP; sendInfo.clientPort = clientPort; /* 查找本地可用的UDP端口,这里先使用10010测试 */ sendInfo.localPort = 10010; 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) { /* 获取RTP发送线程 */ } /* 处理心跳请求 */ void RTPServer::handleHeartbeat(RtpSendClientInfo_t& clientInfo) { } /* 处理注销请求 */ void RTPServer::handleLogout(RtpSendClientInfo_t& clientInfo) { } /* 获取发送UDP数据的指针 */ bool RTPServer::getSendUdpSocketPtr(SoundCardRoadInfo_t roadID) { return true; }