010f0554创建于 2025年3月29日历史提交
/**
 * 版权所有 (c) 华为技术有限公司 2023-2023
 * 服务端网络管理模块类,负责依据网络类型,启动相关监听服务或者连接对应的服务端
 * 1. 依据部署类型,传入对应的网络类型(视频流场景、指令流场景、弹性GPU场景),启动对应的监听服务或连接对应端口
 * 2. 管理网络连接,监听到网络连接断开时,回调离线消息,新收到链接时,回到上线消息
 */
#ifndef NETWORK_COMM_MANAGER_H
#define NETWORK_COMM_MANAGER_H
#include <mutex>
#include <memory>
#include <map>
#include <string>
#include <vector>
#include "NetworkExport.h"
#include "NetworkComm.h"
#include "Communication/Connection/ServerConnection.h"
#include "Communication/NetComm/NetComm.h"
#include "Utils/Looper.h"

namespace Vmi {
class BreakNetCommRunnable : public Runnable {
public:
    explicit BreakNetCommRunnable(NetComm& comm);

    int Run() override;
private:
    NetComm& m_comm;
};

class ConnectRenderServerRunnable : public Runnable {
public:
    int Run() override;
};

class NetworkCommManager {
public:
    static NetworkCommManager& GetInstance();

    bool Initialize(NetworkType type);

    void UnInitialize();

    uint32_t GetSendDataReservedByte();

    void RegisterNetworkChangeStatus(NetworkChangeCallback callback);

    void BreakNetCommSync(NetComm& comm);

    void ConnectRenaderServer();
private:
    NetworkCommManager() = default;
    ~NetworkCommManager();
    NetworkCommManager(const NetworkCommManager&) = delete;
    NetworkCommManager(NetworkCommManager &&) = delete;
    NetworkCommManager& operator=(const NetworkCommManager&) = delete;
    NetworkCommManager& operator=(NetworkCommManager &&) = delete;
    bool VerifyType(NetworkType type);
    VersionCheck::EngineType GetVersionCheckType();
    void BreakNetComm(NetComm& comm);
    void AcceptNewNetComm(const ServerConnection& connection, std::unique_ptr<NetComm> comm);
    bool ConnectRenderServerImpl();
    bool GetElasticGpuRenderInfo();
    void PostConnectRenderServerRunnable();
    void ElasticGpuNetCommBreak(bool isServer);

private:
    std::unique_ptr<ServerConnection> m_serverListen = nullptr;
    std::shared_ptr<NetworkComm> m_serverComm = nullptr;
    std::shared_ptr<NetworkComm> m_clientComm = nullptr;
    NetworkChangeCallback m_callback = nullptr;
    NetworkType m_type = NetworkType::ERROR;
    std::string m_renderIp = "";
    int m_renderPort = 0;
    std::mutex m_mutex = {};
    bool m_isInit = false;
    bool m_isKeep = false;
};
}

#endif