123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- #include "RtpServer.h"
- #include <QTcpSocket>
- #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<int>(socketError), m_tcpServer->errorString().toStdString());
- }
- /* 断开连接 */
- void RTPServer::do_disconnect()
- {
- QTcpSocket* clientSocket = qobject_cast<QTcpSocket*>(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<QTcpSocket*>(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<RtpRecvClientInfo_t*>(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;
- }
|