9 #include<jsoncpp/json/json.h>
25 #include<openssl/sha.h>
29 #include<sys/socket.h>
31 #include<openssl/bio.h>
32 #include<openssl/evp.h>
33 #include<openssl/buffer.h>
38 #include<condition_variable>
40 #include<unordered_map>
41 #include <openssl/ssl.h>
42 #include <openssl/err.h>
43 #include<openssl/crypto.h>
52 #include <sys/eventfd.h>
53 #include <sys/timerfd.h>
100 : capacity_(capacity_pow2),
101 mask_(capacity_pow2 - 1),
102 buffer_(capacity_pow2),
107 if (capacity_ < 2 || (capacity_ & mask_) != 0) {
109 throw std::invalid_argument(
"MPSCQueue capacity must be power of two and >= 2");
113 for (std::size_t i = 0; i < capacity_; ++i) {
114 buffer_[i].seq.store(i, std::memory_order_relaxed);
131 bool push(T&& v) noexcept(std::is_nothrow_move_constructible_v<T>) {
132 return emplace_impl(std::move(v));
135 bool push(
const T& v) noexcept(std::is_nothrow_copy_constructible_v<T>) {
136 return emplace_impl(v);
143 bool pop(T& out) noexcept(std::is_nothrow_move_assignable_v<T> &&
144 std::is_nothrow_move_constructible_v<T>)
146 Slot& slot = buffer_[head_ & mask_];
147 const std::size_t seq = slot.seq.load(std::memory_order_acquire);
148 const std::intptr_t dif =
static_cast<std::intptr_t
>(seq) - static_cast<std::intptr_t>(head_ + 1);
156 out = std::move(*slot.ptr());
163 slot.seq.store(head_ + capacity_, std::memory_order_release);
174 const std::size_t t = tail_.load(std::memory_order_relaxed);
175 const std::size_t h = head_;
176 return (t >= h) ? (t - h) : 0;
181 std::atomic<std::size_t> seq;
182 typename std::aligned_storage<sizeof(T), alignof(T)>::type storage;
183 bool has_value =
false;
185 T* ptr() noexcept {
return reinterpret_cast<T*
>(&storage); }
186 const T* ptr() const noexcept {
return reinterpret_cast<const T*
>(&storage); }
189 void construct(U&& v) noexcept(std::is_nothrow_constructible_v<T, U&&>) {
190 ::new (static_cast<void*>(&storage)) T(std::forward<U>(v));
194 void destroy() noexcept {
203 bool emplace_impl(U&& v) noexcept(std::is_nothrow_constructible_v<T, U&&>) {
204 std::size_t pos = tail_.load(std::memory_order_relaxed);
207 Slot& slot = buffer_[pos & mask_];
208 const std::size_t seq = slot.seq.load(std::memory_order_acquire);
209 const std::intptr_t dif =
static_cast<std::intptr_t
>(seq) - static_cast<std::intptr_t>(pos);
213 if (tail_.compare_exchange_weak(
215 std::memory_order_relaxed,
216 std::memory_order_relaxed))
219 slot.construct(std::forward<U>(v));
221 slot.seq.store(pos + 1, std::memory_order_release);
225 }
else if (dif < 0) {
230 pos = tail_.load(std::memory_order_relaxed);
236 const std::size_t capacity_;
237 const std::size_t mask_;
238 std::vector<Slot> buffer_;
244 std::atomic<std::size_t> tail_;
269 static bool createDir(
const std::string & ddir,
const mode_t &mode=0775);
278 static bool copy(
const std::string &sourceFile,
const std::string &objectFile);
287 static bool createFile(
const std::string &filePath,
const mode_t &mode=0666);
294 static size_t get_file_size(
const std::string &fileName);
320 FileThreadLock(
const std::string &loc,
const int &threads):loc(loc),threads(threads){};
332 static std::mutex
l1;
333 static std::unordered_map<std::string,FileThreadLock>
fl2;
342 std::vector<std::string> data;
343 std::vector<std::string> backUp;
344 char *data_binary=
nullptr;
345 char *backUp_binary=
nullptr;
349 size_t multiple_backup=0;
354 std::string fileName;
356 std::string fileNameTemp;
361 uint64_t totalLines=0;
406 bool openFile(
const std::string &fileName,
const bool &create=
true,
const int &multiple=0,
const size_t &size=0,
const mode_t &mode=0666);
412 bool closeFile(
const bool &del=
false);
474 bool unlockMemory(
const bool &rec=
false);
489 int findC(
const std::string &targetString,
const int linePos=1);
499 bool appendLineC(
const std::string &data,
const int &linePos=0);
508 bool deleteLineC(
const int &linePos=0);
525 bool chgLineC(
const std::string &data,
const int &linePos=0);
535 bool readLineC(std::string &data,
const int linePos);
545 std::string& readC(std::string &data,
const int &linePos,
const int &num);
552 std::string& readAllC(std::string &data);
568 bool readC(
char *data,
const size_t &pos,
const size_t &size);
579 bool writeC(
const char *data,
const size_t &pos,
const size_t &size);
600 int find(
const std::string &targetString,
const int linePos=1);
610 bool appendLine(
const std::string &data,
const int &linePos=0);
619 bool deleteLine(
const int &linePos=0);
636 bool chgLine(
const std::string &data,
const int &linePos=0);
646 bool readLine(std::string &data,
const int linePos);
656 std::string& read(std::string &data,
const int &linePos,
const int &num);
663 std::string& readAll(std::string &data);
679 bool read(
char *data,
const size_t &pos,
const size_t &size);
690 bool write(
const char *data,
const size_t &pos,
const size_t &size);
737 Duration(
long long a,
int b,
int c,
int d,
int e):day(a),hour(b),min(c),sec(d),msec(e){}
747 total=day*24*60*60*1000+hour*60*60*1000+min*60*1000+sec*1000+msec;
763 total=day*24*60*60*1000+hour*60*60*1000+min*60*1000+sec*1000+msec;
779 total=day*24*60*60*1000+hour*60*60*1000+min*60*1000+sec*1000+msec;
795 total=day*24*60*60*1000+hour*60*60*1000+min*60*1000+sec*1000+msec;
811 total=day*24*60*60*1000+hour*60*60*1000+min*60*1000+sec*1000+msec;
861 return Duration(dayy,hourr,minn,secc,msecc);
876 msecc=dayy*24*60*60*1000+hourr*60*60*1000+minn*60*1000+secc*1000+msecc-b.
day*24*60*60*1000-b.
hour*60*60*1000-b.
min*60*1000-b.
sec*1000-b.
msec;
905 return Duration(dayy,hourr,minn,secc,msecc);
914 total=hour*60*60*1000+min*60*1000+sec*1000+msec;
915 double k=day+total/86400000.0000;
924 total=min*60*1000+sec*1000+msec;
925 double k=day*24+hour+total/36000000.0000;
935 double k=day*24*60+hour*60+min+total/60000.0000;
945 double k=day*24*60*60+hour*60*60+min*60+sec+total/1000.0000;
954 total=day*24*60*60*1000+hour*60*60*1000+min*60*1000+sec*1000+msec;
993 return Duration(day,hour,min,sec,msec);
1007 std::ostream&
operator<<(std::ostream &os,
const Duration &a);
1014 #define ISO8086A "yyyy-mm-ddThh:mi:ss"
1018 #define ISO8086B "yyyy-mm-ddThh:mi:ss.sss"
1032 static std::string &toPGtimeFormat();
1033 static std::chrono::system_clock::time_point strToTimePoint(
const std::string &timeStr,
const std::string &format=
ISO8086A);
1034 static std::string& timePointToStr(
const std::chrono::system_clock::time_point &tp,std::string &timeStr,
const std::string &format=
ISO8086A);
1043 static std::string& getTime(std::string &timeStr,
const std::string &format=
ISO8086A);
1052 static bool convertFormat(std::string &timeStr,
const std::string &oldFormat,
const std::string &newFormat=
ISO8086A);
1062 static Duration& calculateTime(
const std::string &time1,
const std::string &time2,
Duration &result,
const std::string &format1=
ISO8086A,
const std::string &format2=
ISO8086A);
1073 static std::string& calculateTime(
const std::string &time1,
const Duration &time2,std::string &result,
const std::string &am,
const std::string &format1=
ISO8086A,
const std::string &format2=
ISO8086A);
1083 static bool compareTime(
const std::string &time1,
const std::string &time2,
const std::string &format1=
ISO8086A,
const std::string &format2=
ISO8086A);
1087 std::chrono::steady_clock::time_point start;
1088 std::chrono::steady_clock::time_point end;
1129 std::string timeFormat;
1130 std::string contentFormat;
1131 std::atomic<bool> consumerGuard{
true};
1135 std::thread consumerThread;
1157 LogFile(
const size_t &logQueue_cap=8192):logQueue(logQueue_cap)
1160 consumerThread = std::thread([
this]()->
void
1162 std::string content;
1163 content.reserve(1024);
1165 content.reserve(1074);
1166 while(this->consumerGuard)
1168 while(this->logQueue.pop(content))
1170 getTime(time,timeFormat);
1171 time+=contentFormat;
1173 this->appendLine(time);
1175 std::this_thread::sleep_for(std::chrono::microseconds(500));
1188 bool openFile(
const std::string &fileName,
const std::string &timeFormat=
ISO8086A,
const std::string &contentFormat=
" ");
1204 bool closeFile(
const bool &del=
false);
1209 void writeLog(
const std::string &data);
1222 bool deleteLogByTime(
const std::string &date1=
"1",
const std::string &date2=
"2");
1252 static bool encryptSymmetric(
const unsigned char *before,
const size_t &length,
const unsigned char *passwd,
const unsigned char *iv,
unsigned char *after);
1263 static bool decryptSymmetric(
const unsigned char *before,
const size_t &length,
const unsigned char *passwd,
const unsigned char *iv,
unsigned char *after);
1276 static std::string& sha1(
const std::string &ori_str,std::string &result);
1289 static std::string& sha11(
const std::string &ori_str,std::string &result);
1304 static std::string& bitOutput(
char input,std::string &result);
1312 static std::string& bitOutput(
const std::string &input,std::string &result);
1321 static char& bitOutput_bit(
char input,
const int pos,
char &result);
1329 static unsigned long& bitStrToNumber(
const std::string &input,
unsigned long &result);
1339 static unsigned long& bitToNumber(
const std::string &input,
unsigned long &result);
1347 static char& toBit(
const std::string &input,
char &result);
1355 static std::string& toBit(
const std::string &input,std::string &result);
1370 static long getRandomNumber(
const long &a,
const long &b);
1377 static std::string& getRandomStr_base64(std::string &str,
const int &length);
1391 static std::string& generateMask_4(std::string &mask);
1410 static unsigned long& htonl_ntohl_64(
unsigned long &data);
1428 static std::string& getPreciesFloat(
const float &number,
const int &bit,std::string &str);
1436 static float& getPreciesFloat(
float &number,
const int &bit);
1445 static std::string& getPreciesDouble(
const double &number,
const int &bit,std::string &str);
1453 static double& getPreciesDouble(
double &number,
const int &bit);
1465 static float& getValidFloat(
float &number,
const int &bit);
1490 static size_t get_split_str(
const std::string_view& ori_str,std::string_view &str,
const std::string_view &a,
const std::string_view &b,
const size_t &pos=0);
1501 static std::string_view& get_value_str(
const std::string_view& ori_str,std::string_view &str,
const std::string& name);
1510 static std::string_view& get_value_header(
const std::string_view& ori_str,std::string_view &str,
const std::string& name);
1520 static std::string_view& get_location_str(
const std::string_view& ori_str,std::string_view &str);
1530 static std::string_view& getLocPara(
const std::string_view &url,std::string_view &locPara);
1539 static std::string_view& getPara(
const std::string_view &url,std::string_view ¶);
1558 static size_t get_split_str(
const std::string_view& ori_str,std::string &str,
const std::string_view &a,
const std::string_view &b,
const size_t &pos=0);
1569 static std::string& get_value_str(
const std::string& ori_str,std::string &str,
const std::string& name);
1578 static std::string& get_value_header(
const std::string& ori_str,std::string &str,
const std::string& name);
1588 static std::string& get_location_str(
const std::string& ori_str,std::string &str);
1598 static std::string& getLocPara(
const std::string &url,std::string &locPara);
1607 static std::string& getPara(
const std::string &url,std::string ¶);
1618 static std::string& getIP(
const std::string &url,std::string &IP);
1629 static int& getPort(
const std::string &url,
int &port);
1639 static std::string createHeader(
const std::string& first,
const std::string& second);
1660 template<
class... Args>
1661 static std::string
createHeader(
const std::string& first,
const std::string& second,Args... args)
1663 std::string cf=first+
": "+second+
"\r\n"+createHeader(args...);
1684 static std::string& transfer_websocket_key(std::string &str);
1700 static int& toInt(
const std::string_view&ori_str,
int &result,
const int &i=-1);
1707 static int& str16toInt(
const std::string_view&ori_str,
int &result,
const int &i=-1);
1716 static long& toLong(
const std::string_view&ori_str,
long &result,
const long &i=-1);
1725 static float& toFloat(
const std::string&ori_str,
float &result,
const float &i=-1);
1734 static double& toDouble(
const std::string&ori_str,
double &result,
const double &i=-1);
1742 static bool& toBool(
const std::string_view&ori_str,
bool &result);
1753 static std::string& strto16(
const std::string &ori_str,std::string &result);
1769 static std::string base64_encode(
const std::string &input);
1778 static std::string base64_decode(
const std::string &input);
1790 static std::string& transfer_websocket_key(std::string &str);
1804 static std::string& generateMask_4(std::string &mask);
1815 static std::string& maskCalculate(std::string &data,
const std::string &mask);
1835 static int getValue(
const std::string &oriStr,std::string& result,
const std::string &type=
"value",
const std::string &name=
"a",
const int &num=0);
1842 static std::string toString(
const Json::Value &val);
1848 static Json::Value toJsonArray(
const std::string & str);
1858 template<
class T1,
class T2>
1863 if constexpr (std::is_integral_v<T2>) {
1864 root[first] = Json::Value(static_cast<Json::Int64>(second));
1866 root[first] = second;
1868 Json::StreamWriterBuilder builder;
1869 std::string jsonString=Json::writeString(builder,root);
1883 template<
class T1,
class T2,
class... Args>
1888 if constexpr (std::is_integral_v<T2>) {
1889 root[first] = Json::Value(static_cast<Json::Int64>(second));
1891 root[first] = second;
1893 std::string kk=createJson(args...);
1894 Json::StreamWriterBuilder builder;
1895 std::string jsonString=Json::writeString(builder,root);
1896 jsonString=jsonString.erase(jsonString.length()-2);
1898 return jsonString+
","+kk;
1911 Json::Value root(Json::arrayValue);
1913 Json::StreamWriterBuilder builder;
1914 std::string jsonString=Json::writeString(builder,root);
1926 template<
class T,
class... Args>
1929 Json::Value root(Json::arrayValue);
1931 std::string kk=createArray(args...);
1932 Json::StreamWriterBuilder builder;
1933 std::string jsonString=Json::writeString(builder,root);
1934 jsonString=jsonString.erase(jsonString.length()-2);
1936 return jsonString+
","+kk;
1945 static std::string jsonAdd(
const std::string &a,
const std::string &b);
1952 static std::string& jsonFormatify(
const std::string &a,std::string &b);
1959 static std::string& jsonToUTF8(
const std::string &input,std::string &output);
2043 std::chrono::steady_clock::time_point lastTime{};
2046 std::deque<std::chrono::steady_clock::time_point>
history;
2049 double tokens = 0.0;
2050 std::chrono::steady_clock::time_point lastRefill{};
2073 std::chrono::steady_clock::time_point lastActivity{};
2100 int activeConnections = 0;
2103 std::unordered_map<int, ConnectionState>
conns;
2229 ConnectionLimiter(
const int& maxConn = 20,
const int& idleTimeout = 60) : maxConnections(maxConn),connectionTimeout(idleTimeout){}
2267 void setPathLimit(
const std::string &path,
const int ×,
const int &secs);
2286 DefenseDecision allowConnect(
const std::string &ip,
const int &fd,
const int ×,
const int &secs);
2301 DefenseDecision allowRequest(
const std::string &ip,
const int &fd,
const std::string_view &path,
const int ×,
const int &secs);
2314 void clearIP(
const std::string &ip,
const int &fd);
2328 bool connectionDetect(
const std::string &ip,
const int &fd);
2359 void banIP(
const std::string &ip,
int banSeconds,
const std::string &reasonCN,
const std::string &reasonEN);
2363 void unbanIP(
const std::string &ip);
2367 bool isBanned(
const std::string &ip)
const;
2372 bool allow(
RateState &st,
const RateLimitType &type,
const int ×,
const int &secs,
const std::chrono::steady_clock::time_point &now);
2376 int connectionTimeout;
2379 RateLimitType requestStrategy = RateLimitType::SlidingWindow;
2382 std::unordered_map<std::string, IPInformation> table;
2383 std::unordered_map<std::string, std::pair<int,int>> pathConfig;
2385 std::unordered_map<std::string,std::chrono::steady_clock::time_point> blacklist;
2386 inline void logSecurity(
const std::string &msgCN,
const std::string &msgEN);
2426 void setFD(
const int &fd,SSL *ssl,
const bool &flag1=
false,
const bool &flag2=
false,
const int &sec=-1);
2441 void close(
const bool &cle=
true);
2446 void blockSet(
const int &sec = -1);
2479 int sendData(
const std::string &data,
const bool &block=
true);
2499 int sendData(
const char *data,
const uint64_t &length,
const bool &block=
true);
2515 int recvDataByLength(std::string &data,
const uint64_t &length,
const int &sec=2);
2531 int recvDataByLength(
char *data,
const uint64_t &length,
const int &sec=2);
2544 int recvData(std::string &data,
const uint64_t &length);
2557 int recvData(
char *data,
const uint64_t &length);
2567 std::string serverIP=
"";
2571 SSL_CTX *ctx=
nullptr;
2578 void closeAndUnCreate();
2579 bool initCTX(
const char *ca,
const char *cert=
"",
const char *key=
"",
const char *passwd=
"");
2593 TcpClient(
const bool &TLS=
false,
const char *ca=
"",
const char *cert=
"",
const char *key=
"",
const char *passwd=
"");
2600 bool connect(
const std::string &ip,
const int &port);
2614 void resetCTX(
const bool &TLS=
false,
const char *ca=
"",
const char *cert=
"",
const char *key=
"",
const char *passwd=
"");
2666 HttpClient(
const bool &TLS=
false,
const char *ca=
"",
const char *cert=
"",
const char *key=
"",
const char *passwd=
""):
TcpClient(TLS,ca,cert,key,passwd){}
2680 bool getRequest(
const std::string &url,
const std::string &header=
"",
const std::string &header1=
"Connection: keep-alive",
const int &sec=-1);
2694 bool postRequest(
const std::string &url,
const std::string &body=
"",
const std::string &header=
"",
const std::string &header1=
"Connection: keep-alive",
const int &sec=-1);
2709 bool getRequestFromFD(
const int &fd,SSL *ssl,
const std::string &url,
const std::string &header=
"",
const std::string &header1=
"Connection: keep-alive",
const int &sec=2);
2725 bool postRequestFromFD(
const int &fd,SSL *ssl,
const std::string &url,
const std::string &body=
"",
const std::string &header=
"",
const std::string &header1=
"Connection: keep-alive",
const int &sec=2);
2735 std::string header=
"";
2739 std::string body=
"";
2750 std::function<bool(const int &fd)> fc=[](
const int &fd)->
bool
2752 std::function<void(const int &fd)> fcEnd=[](
const int &fd)->
void
2754 std::function<bool(const int &fd)> fcTimeOut=[](
const int &fd)->
bool
2838 std::function<bool(const std::string &message,WebSocketClient &k)> fc=[](
const std::string &message,
WebSocketClient &k)->
bool
2839 {std::cout<<
"收到: "<<message<<std::endl;
return true;};
2858 WebSocketClient(
const bool &TLS=
false,
const char *ca=
"",
const char *cert=
"",
const char *key=
"",
const char *passwd=
""):
TcpClient(TLS,ca,cert,key,passwd){}
2876 bool connect(
const std::string &url,
const int &min=20);
2899 bool sendMessage(
const std::string &message,
const std::string &type=
"0001");
2909 void close(
const std::string &closeCodeAndMessage,
const bool &wait=
true);
2927 void close(
const short &code=1000,
const std::string &message=
"bye",
const bool &wait=
true);
2999 std::unordered_map<std::string,std::any>
ctx;
3017 void setFD(
const int &fd,SSL *ssl=
nullptr,
const bool &flag1=
false,
const bool &flag2=
true){TcpFDHandler::setFD(fd,ssl,flag1,flag2);}
3042 bool sendBack(
const std::string &data,
const std::string &header=
"",
const std::string &code=
"200 OK",
const std::string &header1=
"");
3055 bool sendBack(
const char *data,
const size_t &length,
const char *header=
"\0",
const char *code=
"200 OK\0",
const char *header1=
"\0",
const size_t &header_length=50);
3105 std::string message=
"";
3117 std::unordered_map<std::string,std::any>
ctx;
3144 std::unordered_map<std::string,std::any>
ctx;
3248 SSL_CTX *ctx=
nullptr;
3264 std::function<void(const int &fd)> closeFun=[](
const int &fd)->
void
3270 std::function<bool(TcpFDHandler &k,TcpInformation &inf)> globalSolveFun=[](TcpFDHandler &k,TcpInformation &inf)->
bool
3272 std::unordered_map<std::string,std::vector<std::function<int(TcpFDHandler &k,TcpInformation &inf)>>> solveFun;
3273 std::function<int(TcpFDHandler &k,TcpInformation &inf)> parseKey=[](TcpFDHandler &k,TcpInformation &inf)->
int
3274 {inf.ctx[
"key"]=inf.data;
return 1;};
3280 void epolll(
const int &evsNum);
3282 virtual void handler_netevent(
const int &fd);
3283 virtual void handler_workerevent(
const int &fd,
const int &ret);
3284 virtual void handleHeartbeat()=0;
3298 void putTask(
const std::function<
int(TcpFDHandler &k,TcpInformation &inf)> &fun,TcpFDHandler &k,TcpInformation &inf);
3327 TcpServer(
const unsigned long long &maxFD=1000000,
const int &buffer_size=256,
const size_t &finishQueue_cap=65536,
const bool &security_open=
true,
3328 const int &connectionNumLimit=20,
const int &connectionSecs=1,
const int &connectionTimes=6,
const int &requestSecs=1,
const int &requestTimes=40,
3329 const int &checkFrequency=60,
const int &connectionTimeout=60):maxFD(maxFD),buffer_size(buffer_size*1024),finishQueue(finishQueue_cap),security_open(security_open),connectionSecs(connectionSecs),connectionTimes(connectionTimes),requestSecs(requestSecs),requestTimes(requestTimes),
3330 connectionLimiter(connectionNumLimit,connectionTimeout),checkFrequency(checkFrequency){serverType=1;}
3337 bool startListen(
const int &port,
const int &threads=8);
3364 bool setTLS(
const char *cert,
const char *key,
const char *passwd,
const char *ca);
3401 auto [it, inserted] = solveFun.try_emplace(key);
3402 it->second.push_back(std::move(fc));
3432 virtual bool close(
const int &fd);
3468 void setPathLimit(
const std::string &path,
const int ×,
const int &secs){this->connectionLimiter.setPathLimit(path,times,secs);}
3472 void setCloseFun(std::function<
void(
const int &fd)> closeFun){this->closeFun=closeFun;}
3483 SSL* getSSL(
const int &fd);
3502 std::vector<std::function<int(HttpServerFDHandler &k,HttpRequestInformation &inf)>> globalSolveFun;
3504 std::unordered_map<std::string,std::vector<std::function<int(HttpServerFDHandler &k,HttpRequestInformation &inf)>>> solveFun;
3506 {inf.
ctx[
"key"]=inf.loc;
return 1;};
3513 void handler_netevent(
const int &fd);
3514 void handler_workerevent(
const int &fd,
const int &ret);
3515 void handleHeartbeat(){}
3559 HttpServer(
const unsigned long long &maxFD=1000000,
const int &buffer_size=256,
const size_t &finishQueue_cap=65536,
const bool &security_open=
true,
3560 const int &connectionNumLimit=10,
const int &connectionSecs=1,
const int &connectionTimes=3,
const int &requestSecs=1,
const int &requestTimes=20,
3561 const int &checkFrequency=30,
const int &connectionTimeout=30):
TcpServer(
3621 auto [it, inserted] = solveFun.try_emplace(key);
3622 it->second.push_back(std::move(fc));
3650 return TcpServer::startListen(port,threads);
3674 void setFD(
const int &fd,SSL *ssl=
nullptr,
const bool &flag1=
false,
const bool &flag2=
true){TcpFDHandler::setFD(fd,ssl,flag1,flag2);}
3712 bool sendMessage(
const std::string &msg,
const std::string &type=
"0001");
3722 std::unordered_map<int,WebSocketFDInformation> wbclientfd;
3735 std::unordered_map<std::string,std::vector<std::function<int(WebSocketServerFDHandler &k,WebSocketFDInformation &inf)>>> solveFun;
3737 {inf.
ctx[
"key"]=inf.message;
return 1;};
3742 void handler_netevent(
const int &fd);
3743 void handler_workerevent(
const int &fd,
const int &ret);
3746 void closeAck(
const int &fd,
const std::string &closeCodeAndMessage);
3747 void closeAck(
const int &fd,
const short &code=1000,
const std::string &message=
"bye");
3749 void handleHeartbeat();
3750 bool closeWithoutLock(
const int &fd,
const std::string &closeCodeAndMessage);
3751 bool closeWithoutLock(
const int &fd,
const short &code=1000,
const std::string &message=
"bye");
3794 WebSocketServer(
const unsigned long long &maxFD=1000000,
const int &buffer_size=256,
const size_t &finishQueue_cap=65536,
const bool &security_open=
true,
3795 const int &connectionNumLimit=5,
const int &connectionSecs=10,
const int &connectionTimes=3,
const int &requestSecs=1,
const int &requestTimes=10,
3796 const int &checkFrequency=60,
const int &connectionTimeout=120):
TcpServer(
3866 auto [it, inserted] = solveFun.try_emplace(key);
3867 it->second.push_back(std::move(fc));
3908 bool closeFD(
const int &fd,
const std::string &closeCodeAndMessage);
3928 bool closeFD(
const int &fd,
const short &code=1000,
const std::string &message=
"bye");
3962 bool close(
const int &fd);
3973 return TcpServer::startListen(port,threads);
3996 void sendMessage(
const std::string &msg,
const std::string &type=
"0001");
4023 void setFD(
const int &fd,
const bool &flag1=
false,
const int &sec=-1,
const bool &flag2=
false);
4028 void blockSet(
const int &sec=-1);
4046 void close(
const bool &cle=
true);
4065 int sendData(
const std::string &data,
const std::string &ip,
const int &port,
const bool &block=
true);
4085 int sendData(
const char *data,
const uint64_t &length,
const std::string &ip,
const int &port,
const bool &block=
true);
4100 int recvData(std::string &data,
const uint64_t &length,std::string &ip,
int &port);
4115 int recvData(
char *data,
const uint64_t &length,std::string &ip,
int &port);
4129 UdpClient(
const bool &flag1=
false,
const int &sec=-1);
4135 bool createFD(
const bool &flag1=
false,
const int &sec=-1);
4153 UdpServer(
const int &port,
const bool &flag1=
false,
const int &sec=-1,
const bool &flag2=
true);
4160 bool createFD(
const int &port,
const bool &flag1=
false,
const int &sec=-1,
const bool &flag2=
true);
4205 static void setExceptionHandling();
4213 static void setLogFile(file::LogFile *logfile=
nullptr,
const std::string &language=
"");
4219 static void init(file::LogFile *logfile=
nullptr,
const std::string &language=
"");
4241 struct semid_ds *buf;
4242 unsigned short *arry;
4267 bool init(key_t key,
unsigned short value = 1,
short sem_flg = SEM_UNDO);
4277 bool wait(
short value = -1);
4287 bool post(
short value = 1);
4314 #define MAX_PROCESS_NAME 100
4318 #define MAX_PROCESS_INF 1000
4322 #define SHARED_MEMORY_KEY 0x5095
4326 #define SHARED_MEMORY_LOCK_KEY 0x5095
4382 bool join(
const char *name,
const char *argv0=
"",
const char *argv1=
"",
const char *argv2=
"");
4398 static bool HBCheck(
const int &sec);
4403 bool deleteFromHBS();
4439 template<
class... Args>
4440 static bool startProcess(
const std::string &name,
const int &sec=-1,Args ...args)
4442 std::vector<const char *> paramList={args...,
nullptr};
4452 execv(name.c_str(),
const_cast<char* const*
>(paramList.data()));
4456 for(
int ii=1;ii<=64;ii++)
4467 signal(SIGCHLD,SIG_DFL);
4474 execv(name.c_str(),
const_cast<char* const*
>(paramList.data()));
4509 template<
class Fn,
class... Args>
4510 static typename std::enable_if<!std::is_convertible<Fn, std::string>::value,
bool>::type
4522 auto f=std::bind(std::forward<Fn>(fn),std::forward<Args>(args)...);
4527 for(
int ii=1;ii<=64;ii++)
4538 signal(SIGCHLD,SIG_DFL);
4545 auto f=std::bind(std::forward<Fn>(fn),std::forward<Args>(args)...);
4562 using Task = std::function<void()>;
4600 for (
size_t i = 0; i < n; ++i) {
4601 threads_.emplace_back([
this] {
4626 std::lock_guard<std::mutex> lk(mtx_);
4627 tasks_.push(std::move(task));
4644 std::lock_guard<std::mutex> lk(mtx_);
4648 for (
auto &t : threads_)
4650 if (t.joinable()) t.join();
4671 std::unique_lock<std::mutex> lk(mtx_);
4672 cv_.wait(lk, [
this] {
4673 return stop_ || !tasks_.empty();
4675 if (stop_ && tasks_.empty())
4679 task = std::move(tasks_.front());
4687 std::vector<std::thread> threads_;
4688 std::queue<Task> tasks_;
4690 std::condition_variable cv_;
void setSecuritySendBackFun(std::function< void(HttpServerFDHandler &k, HttpRequestInformation &inf)> fc)
设置违反信息安全策略时候的返回函数
Definition: sttnet.h:3583
void setStartFunction(std::function< bool(WebSocketServerFDHandler &k, WebSocketFDInformation &inf)> fccc)
设置websocket连接成功后就执行的回调函数 注册一个回调函数
Definition: sttnet.h:3837
统一的连接与请求安全裁决器(IP 级 + fd 级,多策略限流 + 黑名单)。
Definition: sttnet.h:2220
std::chrono::duration< uint64_t > Seconds
Definition: sttnet.h:1010
bool operator>(const Duration &b)
判断当前时间间隔是否大于另一个时间间隔。
Definition: sttnet.h:744
int getServerPort()
返回已连接的客户端的端口 return 已连接的服务端的端口
Definition: sttnet.h:2634
int fd
底层套接字
Definition: sttnet.h:3217
SSL * getSSL()
获取该对象的加密SSL句柄
Definition: sttnet.h:2436
Definition: sttnet.h:2128
int checkFrequency
Definition: sttnet.h:3261
bool isStart()
返回本对象计时状态
Definition: sttnet.h:1116
TcpFDInf * clientfd
Definition: sttnet.h:3239
std::string getServerIp()
如果连接到了服务器 返回服务器ip
Definition: sttnet.h:2943
bool unblock
Definition: sttnet.h:3247
int ret
返回值 -2:失败并且要求关闭连接 -1:失败但不需要关闭连接 1:成功
Definition: sttnet.h:3221
void setFD(const int &fd, SSL *ssl=nullptr, const bool &flag1=false, const bool &flag2=true)
初始化对象,传入套接字等参数
Definition: sttnet.h:3017
tcp协议的套接字操作类
Definition: sttnet.h:2403
void setConnectStrategy(const stt::security::RateLimitType &type)
设置“连接速率限流”所使用的策略。
Definition: sttnet.h:3439
static std::string createJson(T1 first, T2 second, Args...args)
创建多个键值对组成的 JSON 字符串(递归变参模板)。
Definition: sttnet.h:1884
表示时间间隔的结构体,支持天、小时、分钟、秒和毫秒粒度。
Definition: sttnet.h:712
void setGlobalSolveFunction(std::function< int(HttpServerFDHandler &k, HttpRequestInformation &inf)> fc)
设置全局备用函数
Definition: sttnet.h:3592
WebSocket协议的操作类 仅传入套接字,然后使用这个类进行WebSocket的操作
Definition: sttnet.h:3664
bool isConnect()
判断对象是否有套接字绑定
Definition: sttnet.h:2459
时间操作、运算、计时的类
Definition: sttnet.h:1027
int getFD()
获取该对象的套接字
Definition: sttnet.h:2431
void waitAndQuit(const time::Duration &t=time::Duration{0, 0, 0, 10, 10})
开始退出epoll倒计时,直到套接字有新的消息 如果套接字倒计时结束还没有新的消息,那么退出epoll
Definition: sttnet.h:2821
bool operator<=(const Duration &b)
判断当前时间间隔是否小于等于另一个时间间隔。
Definition: sttnet.h:808
Http/HttpServer 服务端操作类
Definition: sttnet.h:3497
bool sendMessage(const int &fd, const std::string &msg, const std::string &type="0001")
发送 WebSocket 消息给某一个客户端
Definition: sttnet.h:3952
void setCloseFun(std::function< void(const int &fd)> closeFun)
设置关闭tcp连接之后调用的函数
Definition: sttnet.h:3472
工作现场完成任务后压入完成队列的数据结构
Definition: sttnet.h:3212
pid_t pid
进程id
Definition: sttnet.h:4336
WebSocketClient(const bool &TLS=false, const char *ca="", const char *cert="", const char *key="", const char *passwd="")
WebSocketClient类的构造函数
Definition: sttnet.h:2858
Duration operator+(const Duration &b)
将两个时间间隔相加。
Definition: sttnet.h:824
Duration(long long a, int b, int c, int d, int e)
构造函数,传入天,时,分,秒,毫秒
Definition: sttnet.h:737
int getFD()
返回fd
Definition: sttnet.h:4041
std::string loc
文件路径
Definition: sttnet.h:306
unsigned long p_buffer_now
接收空间位置指针
Definition: sttnet.h:3206
bool isConnect()
返回对象的连接状态
Definition: sttnet.h:2639
MPSCQueue & operator=(const MPSCQueue &)=delete
std::ostream & operator<<(std::ostream &os, const Duration &a)
将 Duration 对象以可读格式输出到流中。
LogFile(const size_t &logQueue_cap=8192)
构造函数,初始化消费者线程
Definition: sttnet.h:1157
int sec
秒
Definition: sttnet.h:729
~TcpServer()
TcpServer 类的析构函数
Definition: sttnet.h:3488
double convertToMin()
将当前时间间隔转换为以“分钟”为单位的浮点数表示。
Definition: sttnet.h:931
unsigned long buffer_size
Definition: sttnet.h:3234
std::string getServerPort()
如果连接到了服务器 返回服务器端口
Definition: sttnet.h:2948
unsigned long long maxFD
Definition: sttnet.h:3235
int serverType
Definition: sttnet.h:3256
void setPathLimit(const std::string &path, const int ×, const int &secs)
设置某个路径的额外限流规则(path 级)。
Definition: sttnet.h:3468
void setTimeOutFunction(std::function< bool(const int &fd)> fcTimeOut)
设置epoll超时后出发的回调函数 注册一个回调函数
Definition: sttnet.h:2804
Duration recoverForm(const long long &t)
从给定的毫秒数恢复为标准的天-时-分-秒-毫秒格式。
Definition: sttnet.h:962
static std::string createArray(T first)
创建只包含一个元素的 JSON 数组字符串。
Definition: sttnet.h:1909
std::queue< std::any > pendindQueue
等待处理的队列
Definition: sttnet.h:3182
负责字符串和数字的转化
Definition: sttnet.h:1689
~EpollSingle()
EpollSingle的析构函数 调用eldListen阻塞退出epoll.
Definition: sttnet.h:2826
int threads
记录文件正在被多少个线程使用
Definition: sttnet.h:310
void setFunction(const std::string &key, std::function< int(WebSocketServerFDHandler &k, WebSocketFDInformation &inf)> fc)
设置key对应的收到客户端消息后的回调函数
Definition: sttnet.h:3864
static std::string language
系统的日志系统的语言选择,默认为English
Definition: sttnet.h:4191
负责进程心跳监控,调度的类 用于监控服务进程,保证服务进程持续有效运行 进程结束后,0x5095这一块共享内存和信号量都没有删掉 目前只支持最多三个参数的进程加入监控 应该自己手动在程序编写加入心跳监控...
Definition: sttnet.h:4366
std::deque< std::chrono::steady_clock::time_point > history
Definition: sttnet.h:2046
size_t getFileSize()
获取二进制打开的文件的大小
Definition: sttnet.h:450
Definition: sttnet.h:2130
Tcp服务端类
Definition: sttnet.h:3229
uint64_t connection_obj_fd
连接对象fd
Definition: sttnet.h:3166
stt::system::WorkerPool * workpool
Definition: sttnet.h:3233
static std::string createArray(T first, Args...args)
创建多个元素组成的 JSON 数组字符串(递归变参模板)。
Definition: sttnet.h:1927
static std::mutex l1
Definition: sttnet.h:332
std::string port
客户端端口
Definition: sttnet.h:3174
UDP操作的类 传入套接字进行UDP协议的操作
Definition: sttnet.h:4008
int requestTimes
Definition: sttnet.h:3260
size_t getSize1()
获取二进制打开的文件在内存中的大小
Definition: sttnet.h:459
static std::enable_if<!std::is_convertible< Fn, std::string >::value, bool >::type startProcess(Fn &&fn, const int &sec=-1, Args &&...args)
通过函数创建子进程(可选择是否定时重启)
Definition: sttnet.h:4511
uint64_t connection_obj_fd
Definition: sttnet.h:3262
~File()
析构函数
Definition: sttnet.h:417
HttpClient(const bool &TLS=false, const char *ca="", const char *cert="", const char *key="", const char *passwd="")
HttpClient类的构造函数
Definition: sttnet.h:2666
bool push(const T &v) noexcept(std::is_nothrow_copy_constructible_v< T >)
Definition: sttnet.h:135
WebSocketServer服务端操作类
Definition: sttnet.h:3719
解析,响应Http/https请求的操作类 仅传入套接字,然后使用这个类进行Http的操作
Definition: sttnet.h:3007
void setGlobalSolveFunction(std::function< bool(TcpFDHandler &k, TcpInformation &inf)> fc)
设置全局备用函数
Definition: sttnet.h:3388
bool operator<(const Duration &b)
判断当前时间间隔是否小于另一个时间间隔。
Definition: sttnet.h:760
bool isConnect()
返回连接状态
Definition: sttnet.h:2933
负责加密,解密和哈希
Definition: sttnet.h:1239
负责浮点数精度处理
Definition: sttnet.h:1416
void stop()
停止线程池并等待所有线程退出
Definition: sttnet.h:4641
SSL_CTX * ctx
Definition: sttnet.h:3248
负责二进制数据,字符串之间的转化
Definition: sttnet.h:1294
json数据操作类
Definition: sttnet.h:1820
bool push(T &&v) noexcept(std::is_nothrow_move_constructible_v< T >)
Try push (non-blocking). Returns false if queue is full. 尝试入队(非阻塞),队列满则返回 false.
Definition: sttnet.h:131
~HttpServer()
析构函数
Definition: sttnet.h:3655
int connectionTimes
Definition: sttnet.h:3258
MPSCQueue(std::size_t capacity_pow2)
Definition: sttnet.h:99
std::unordered_map< std::string, RateState > pathRate
Definition: sttnet.h:2072
进程信息的结构体
Definition: sttnet.h:4331
static std::unordered_map< std::string, FileThreadLock > fl2
Definition: sttnet.h:333
std::size_t approx_size() const noexcept
Approximate size (may be inaccurate under concurrency) 近似长度(并发下可能不精确)
Definition: sttnet.h:173
#define MAX_PROCESS_NAME
定义MAX_PROCESS_NAME这个宏为100,意思是进程信息中的进程名字长度不超过100个字节
Definition: sttnet.h:4314
tcp协议客户端操作类
Definition: sttnet.h:2564
负责Http字符串和URL解析 包括从 URL 或请求报文中提取参数、IP、端口、请求头字段等功能。
Definition: sttnet.h:1471
double convertToHour()
将当前时间间隔转换为以“小时”为单位的浮点数表示。
Definition: sttnet.h:921
void setGetKeyFunction(std::function< int(HttpServerFDHandler &k, HttpRequestInformation &inf)> parseKeyFun)
设置解析出key的回调函数
Definition: sttnet.h:3639
csemp()
构造函数,初始化内部状态。
Definition: sttnet.h:4255
time_t lastTime
进程最后一次心跳时间,是时间戳
Definition: sttnet.h:4340
long long day
天
Definition: sttnet.h:717
void setGetKeyFunction(std::function< int(TcpFDHandler &k, TcpInformation &inf)> parseKeyFun)
设置解析出key的回调函数
Definition: sttnet.h:3413
void setSecuritySendBackFun(std::function< void(TcpFDHandler &k, TcpInformation &inf)> fc)
设置违反信息安全策略时候的返回函数
Definition: sttnet.h:3378
void setFunction(const std::string &key, std::function< int(TcpFDHandler &k, TcpInformation &inf)> fc)
设置key对应的收到客户端消息后的回调函数
Definition: sttnet.h:3399
std::mutex lock
此文件的锁
Definition: sttnet.h:314
int min
分
Definition: sttnet.h:725
void endListenWithSignal()
发送结束epoll的信号
Definition: sttnet.h:2815
WorkerPool(size_t n)
构造函数,创建指定数量的工作线程
Definition: sttnet.h:4598
Duration operator-(const Duration &b)
计算两个时间间隔的差值(当前对象减去参数 b)。
Definition: sttnet.h:868
Lock-free bounded MPSC queue (Multi-Producer Single-Consumer) 无锁有界多生产者单消费者队列(环形缓冲) ...
Definition: sttnet.h:97
WebSocketServer(const unsigned long long &maxFD=1000000, const int &buffer_size=256, const size_t &finishQueue_cap=65536, const bool &security_open=true, const int &connectionNumLimit=5, const int &connectionSecs=10, const int &connectionTimes=3, const int &requestSecs=1, const int &requestTimes=10, const int &checkFrequency=60, const int &connectionTimeout=120)
构造函数,默认是允许最大1000000个连接,每个连接接收缓冲区最大为256kb,启用安全模块。
Definition: sttnet.h:3794
double convertToSec()
将当前时间间隔转换为以“秒”为单位的浮点数表示。
Definition: sttnet.h:941
std::string getUrl()
如果连接到了服务器 返回url
Definition: sttnet.h:2938
static file::LogFile * logfile
系统的日志系统的读写日志对象的指针
Definition: sttnet.h:4187
TLSState
Definition: sttnet.h:3147
static std::string createHeader(const std::string &first, const std::string &second, Args...args)
递归构造多个 HTTP 请求头字段。
Definition: sttnet.h:1661
用epoll监听单个句柄
Definition: sttnet.h:2745
int workerEventFD
Definition: sttnet.h:3255
int FDStatus
记录当前处理状态机到第几步了
Definition: sttnet.h:3178
~WorkerPool()
析构函数
Definition: sttnet.h:4612
void setPathStrategy(const stt::security::RateLimitType &type)
设置“path 级请求限流”所使用的策略。
Definition: sttnet.h:3454
void setSecuritySendBackFun(std::function< void(WebSocketServerFDHandler &k, WebSocketFDInformation &inf)> fc)
设置违反信息安全策略时候的返回函数
Definition: sttnet.h:3818
bool sendMessage(const std::string &msg, const std::string &type="0001")
发送一条websocket信息
void setFD(const int &fd, SSL *ssl=nullptr, const bool &flag1=false, const bool &flag2=true)
初始化对象,传入套接字等参数
Definition: sttnet.h:3674
int connectionSecs
Definition: sttnet.h:3257
FileThreadLock(const std::string &loc, const int &threads)
这个结构体的构造函数
Definition: sttnet.h:320
bool operator>=(const Duration &b)
判断当前时间间隔是否大于等于另一个时间间隔。
Definition: sttnet.h:792
std::string getFileName()
获取打开的文件名字
Definition: sttnet.h:432
~TcpClient()
TcpClient的析构函数,会关闭释放套接字和其连接
Definition: sttnet.h:2623
void setEndFunction(std::function< void(const int &fd)> fcEnd)
设置epoll退出前的回调函数 注册一个回调函数
Definition: sttnet.h:2794
bool pop(T &out) noexcept(std::is_nothrow_move_assignable_v< T > &&std::is_nothrow_move_constructible_v< T >)
Try pop (single consumer). Returns false if empty. 尝试出队(单消费者),空则返回 false.
Definition: sttnet.h:143
负责websocket协议有关字符串的操作
Definition: sttnet.h:1670
Duration getDt()
获取上一次计时的时间
Definition: sttnet.h:1111
数据编码解码,掩码处理等
Definition: sttnet.h:1758
std::function< void()> Task
Definition: sttnet.h:4562
~UdpServer()
析构函数,对象生命结束会会关闭套接字
Definition: sttnet.h:4164
bool startListen(const int &port, const int &threads=8)
打开Http服务器监听程序
Definition: sttnet.h:3646
bool operator==(const Duration &b)
判断当前时间间隔是否等于另一个时间间隔。
Definition: sttnet.h:776
单一限流器的运行状态(可复用于多种限流策略)。
Definition: sttnet.h:2038
char * buffer
接收空间指针
Definition: sttnet.h:3202
记录文件和线程关系的结构体
Definition: sttnet.h:301
int status
当前fd的接收状态,用于保存接收处理机逻辑
Definition: sttnet.h:3186
void writeLog(const std::string &data)
写一行日志
初始化服务系统的类
Definition: sttnet.h:4181
~UdpClient()
析构函数,对象生命结束会会关闭套接字
Definition: sttnet.h:4139
uint64_t getFileLine()
获取打开的文件的行数
Definition: sttnet.h:441
bool isOpen()
判断对象是否打开了文件
Definition: sttnet.h:422
bool isReturn()
获取服务器返回响应状态
Definition: sttnet.h:2731
int requestSecs
Definition: sttnet.h:3259
std::string_view data
保存收到的客户端传来的数据
Definition: sttnet.h:3190
std::chrono::duration< uint64_t, std::milli > Milliseconds
Definition: sttnet.h:1009
单个连接(fd)的安全与限流状态。
Definition: sttnet.h:2068
RateState requestRate
Definition: sttnet.h:2071
void setGetKeyFunction(std::function< int(WebSocketServerFDHandler &k, WebSocketFDInformation &inf)> parseKeyFun)
设置解析出key的回调函数
Definition: sttnet.h:3884
void setRequestStrategy(const stt::security::RateLimitType &type)
设置“IP 级请求限流”所使用的策略。
Definition: sttnet.h:3446
TLSState tls_state
tls状态
Definition: sttnet.h:3198
Websocket客户端操作的类 -如果需要重新设置TLS/Https加密的证书,目前需要销毁对象后重新构造 底层TCP默认是阻塞的
Definition: sttnet.h:2834
bool isBinary()
判断对象是否以二进制模式打开文件
Definition: sttnet.h:427
std::string getServerIP()
返回已连接的服务端的ip return 已连接的服务端的ip
Definition: sttnet.h:2629
void submit(Task task)
向线程池提交一个任务
Definition: sttnet.h:4623
封装 System V 信号量的同步工具类。
Definition: sttnet.h:4230
~MPSCQueue()
Definition: sttnet.h:121
RateLimitType
限流算法类型(策略)。
Definition: sttnet.h:2012
负责大小端字节序转换
Definition: sttnet.h:1396
~WebSocketServer()
WebSocketServer的析构函数
Definition: sttnet.h:4001
TcpServer(const unsigned long long &maxFD=1000000, const int &buffer_size=256, const size_t &finishQueue_cap=65536, const bool &security_open=true, const int &connectionNumLimit=20, const int &connectionSecs=1, const int &connectionTimes=6, const int &requestSecs=1, const int &requestTimes=40, const int &checkFrequency=60, const int &connectionTimeout=60)
构造函数,默认是允许最大1000000个连接,每个连接接收缓冲区最大为256kb,启用安全模块。
Definition: sttnet.h:3327
std::mutex che
Definition: sttnet.h:335
bool startListen(const int &port, const int &threads=8)
打开Websocket服务器监听程序
Definition: sttnet.h:3969
std::string getFileName()
获取对象打开的文件名
Definition: sttnet.h:1198
udp服务端的操作类
Definition: sttnet.h:4144
double convertToDay()
将当前时间间隔转换为以“天”为单位的浮点数表示。
Definition: sttnet.h:911
bool isListen()
返回epoll监听状态
Definition: sttnet.h:2776
Http/Https客户端操作类
Definition: sttnet.h:2649
int fd
套接字fd
Definition: sttnet.h:3162
bool security_open
Definition: sttnet.h:3252
进程管理的静态工具类
Definition: sttnet.h:4414
int hour
时
Definition: sttnet.h:721
long long convertToMsec()
将当前时间间隔转换为总毫秒数。
Definition: sttnet.h:951
void setFunction(std::function< bool(const int &fd)> fc)
设置epoll触发后的处理函数 注册一个回调函数
Definition: sttnet.h:2786
udp客户端的操作类
Definition: sttnet.h:4121
static std::string createJson(T1 first, T2 second)
创建仅包含一个键值对的 JSON 字符串。
Definition: sttnet.h:1859
void setGlobalSolveFunction(std::function< bool(WebSocketServerFDHandler &k, WebSocketFDInformation &inf)> fc)
设置全局备用函数
Definition: sttnet.h:3828
保存底层基础Tcp通道信息的结构体
Definition: sttnet.h:3157
void setFunction(const std::string &key, std::function< int(HttpServerFDHandler &k, HttpRequestInformation &inf)> fc)
设置key对应的收到客户端消息后的回调函数
Definition: sttnet.h:3619
security::ConnectionLimiter connectionLimiter
Definition: sttnet.h:3236
std::string ip
客户端ip
Definition: sttnet.h:3170
bool isOpen()
获取对象是否打开日志文件的状态
Definition: sttnet.h:1193
DefenseDecision
安全裁决结果(由 ConnectionLimiter 返回)。
Definition: sttnet.h:2126
void setHBTimeOutTime(const int &secb)
设置发送心跳后的等待时间
Definition: sttnet.h:3896
ConnectionLimiter(const int &maxConn=20, const int &idleTimeout=60)
构造函数。
Definition: sttnet.h:2229
日志文件操作类
Definition: sttnet.h:1126
读写磁盘文件的类
Definition: sttnet.h:329
void setJudgeFunction(std::function< bool(WebSocketFDInformation &k)> fcc)
设置websocket握手阶段的检查函数,只有检查通过才执行后续握手 注册一个回调函数
Definition: sttnet.h:3847
int msec
毫秒
Definition: sttnet.h:733
随机数,字符串生成相关
Definition: sttnet.h:1360
SSL * ssl
如果加密了,存放加密句柄
Definition: sttnet.h:3194
bool isListen()
返回对象的监听状态
Definition: sttnet.h:3478
Definition: sttnet.h:2129
static bool startProcess(const std::string &name, const int &sec=-1, Args...args)
启动一个新进程(可选择是否定时重启)
Definition: sttnet.h:4440
#define ISO8086A
定义ISO8086A这个宏为"yyyy-mm-ddThh:mi:ss"
Definition: sttnet.h:1014
void setTimeOutTime(const int &seca)
设置心跳时间
Definition: sttnet.h:3890
void setFunction(std::function< bool(const std::string &message, WebSocketClient &k)> fc)
设置收到服务端消息后的回调函数 注册一个回调函数
Definition: sttnet.h:2869
HttpServer(const unsigned long long &maxFD=1000000, const int &buffer_size=256, const size_t &finishQueue_cap=65536, const bool &security_open=true, const int &connectionNumLimit=10, const int &connectionSecs=1, const int &connectionTimes=3, const int &requestSecs=1, const int &requestTimes=20, const int &checkFrequency=30, const int &connectionTimeout=30)
构造函数,默认是允许最大1000000个连接,每个连接接收缓冲区最大为256kb,启用安全模块。
Definition: sttnet.h:3559
system::MPSCQueue< WorkerMessage > finishQueue
Definition: sttnet.h:3232
固定大小的工作线程池
Definition: sttnet.h:4588