Files
Netralib/include/Netra.hpp

306 lines
11 KiB
C++
Raw Normal View History

2025-07-31 14:47:51 +08:00
#pragma once
#include "QCL_Include.hpp"
namespace QCL
{
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @class TcpServer
* @brief 线TCP服务器类
*
* 使线
* 线
* 线Socket句柄
*/
class TcpServer
{
public:
/**
* @brief
* @param port
*/
TcpServer(int port);
/**
* @brief stop()
*/
~TcpServer();
/**
* @brief socket线
* @return truefalse
*/
bool start();
/**
* @brief 线退
*/
void stop();
/**
* @brief
* @param clientSock Socket描述符
* @param message
*/
void sendToClient(int clientSock, const std::string &message);
/**
* @brief
* @param clientSock Socket描述符
2025-08-04 15:01:31 +08:00
* @param flag:false ,true
*/
2025-08-14 16:18:21 +08:00
std::string receiveFromClient(int clientSock, bool flag = true);
2025-08-04 15:01:31 +08:00
/**
* @brief IP和端口
* @param clientSock Socket描述符
2025-07-31 14:47:51 +08:00
*/
2025-08-04 15:01:31 +08:00
char *getClientIPAndPort(int clientSock);
2025-07-31 14:47:51 +08:00
/**
* @brief Socket的副本
* @return Socket的vector线
*/
std::vector<int> getClientSockets();
private:
/**
* @brief 线
*/
void acceptClients();
private:
int serverSock_; ///< 服务器监听Socket描述符
int port_; ///< 服务器监听端口
std::atomic<bool> running_; ///< 服务器运行状态标志(线程安全)
std::vector<std::thread> clientThreads_; ///< 用于处理每个客户端的线程集合
std::thread acceptThread_; ///< 负责监听新连接的线程
std::mutex clientsMutex_; ///< 保护clientSockets_的互斥锁
std::vector<int> clientSockets_; ///< 当前所有连接的客户端Socket集合
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2025-08-11 11:17:32 +08:00
/**
* @brief 线
*
*
* -
* -
* -
* -
* -
*
*
* -
* -
* -
* - 使 std::mutex 线
*/
class WriteFile
{
public:
/**
* @brief
* @param filePath
*/
explicit WriteFile(const std::string &filePath);
/**
* @brief 线
* @param content
* @return true
* @return false
*/
bool overwriteText(const std::string &content);
/**
* @brief 线
* @param content
* @return true
* @return false
*/
bool appendText(const std::string &content);
/**
* @brief 线
*
*
*
*
* @param content
* @param position
* @return true
* @return false
*/
bool writeOriginal(const std::string &content, std::streampos position = 0);
/**
* @brief 线
* @param data
* @return true
* @return false
*/
bool overwriteBinary(const std::vector<char> &data);
2025-07-31 14:47:51 +08:00
2025-08-11 11:17:32 +08:00
/**
* @brief 线
* @param data
* @return true
* @return false
*/
bool appendBinary(const std::vector<char> &data);
/**
2025-08-13 11:33:31 +08:00
* @brief
* @param pattern
* @param includePattern true pattern false
* @return size_t pattern 0
2025-08-11 11:17:32 +08:00
*/
2025-08-13 11:33:31 +08:00
size_t countBytesBeforePattern(const std::string &pattern, bool includePattern = false);
2025-08-11 11:17:32 +08:00
private:
std::string filePath_; ///< 文件路径
std::mutex writeMutex_; ///< 线程锁,保证多线程写入安全
/**
* @brief 线
* @param content
* @param mode /
* @return true
* @return false
*/
bool writeToFile(const std::string &content, std::ios::openmode mode);
/**
* @brief 线
* @param data
* @param mode /
* @return true
* @return false
*/
bool writeBinary(const std::vector<char> &data, std::ios::openmode mode);
};
2025-08-11 11:35:45 +08:00
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @brief ReadFile -
*
*
* 1. /
* 2.
* 3.
* 4.
* 5.
* 6.
*
*
* - WriteFile
* -
* -
2025-08-11 11:40:28 +08:00
* - 使 std::mutex 线
2025-08-11 11:35:45 +08:00
*/
2025-08-11 11:17:32 +08:00
class ReadFile
{
2025-08-11 11:35:45 +08:00
public:
/**
* @brief
* @param filename
*/
explicit ReadFile(const std::string &filename);
/**
* @brief
*/
~ReadFile();
/**
* @brief
* @return true
* @return false
*/
bool Open();
/**
* @brief
*/
void Close();
/**
* @brief
*/
bool IsOpen() const;
/**
* @brief
* @return
*/
std::string ReadAllText();
/**
* @brief
* @return
*/
std::vector<char> ReadAllBinary();
/**
* @brief
* @return vector
*/
std::vector<std::string> ReadLines();
/**
* @brief
* @param count
* @return
*/
std::vector<char> ReadBytes(size_t count);
/**
* @brief
* @param marker
2025-08-13 11:33:31 +08:00
* @return 0
2025-08-11 11:35:45 +08:00
*/
2025-08-13 11:33:31 +08:00
size_t GetBytesBefore(const std::string &marker, bool includeMarker = false);
2025-08-11 11:17:32 +08:00
2025-08-13 14:25:26 +08:00
/**
* @brief
* @param pos
* @param count 0
* @return
*/
std::vector<char> ReadBytesFrom(size_t pos, size_t count = 0);
2025-08-11 11:35:45 +08:00
/**
* @brief
*/
bool FileExists() const;
/**
* @brief
*/
size_t GetFileSize() const;
/**
* @brief
*/
void Reset();
private:
2025-08-11 11:40:28 +08:00
std::string filename_; // 文件路径
std::ifstream file_; // 文件流对象
mutable std::mutex mtx_; // 可变,保证 const 方法也能加锁
2025-08-11 11:35:45 +08:00
};
2025-08-11 11:17:32 +08:00
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2025-08-11 11:35:45 +08:00
2025-07-31 14:47:51 +08:00
// 屏蔽所有信号
void blockAllSignals();
2025-08-13 14:25:26 +08:00
// 去除字符串的左空格
std::string Ltrim(const std::string &s);
// 去除字符串右侧的空格
std::string Rtrim(const std::string &s);
// 去除字符串左右两侧的空格
std::string LRtrim(const std::string &s);
2025-07-31 14:47:51 +08:00
}