STTNet 0.7.0
Loading...
Searching...
No Matches
sttnet.h
Go to the documentation of this file.
1
91#ifndef PUBLIC_H
92#define PUBLIC_H 1
93#include<jsoncpp/json/json.h>
94#include<string_view>
95#include<string>
96#include<atomic>
97#include<iostream>
98#include<unistd.h>
99#include<sys/stat.h>
100#include<fstream>
101#include<fcntl.h>
102#include<sstream>
103#include<mutex>
104#include<chrono>
105#include<iomanip>
106#include<random>
107#include<cmath>
108#include<thread>
109#include<openssl/sha.h>
110#include<netdb.h>
111#include<arpa/inet.h>
112#include<sys/types.h>
113#include<sys/socket.h>
114#include<cstring>
115#include<openssl/bio.h>
116#include<openssl/evp.h>
117#include<openssl/buffer.h>
118#include<functional>
119#include<list>
120#include<queue>
121#include<sys/epoll.h>
122#include<condition_variable>
123#include <regex>
124#include<unordered_map>
125#include <openssl/ssl.h>
126#include <openssl/err.h>
127#include<openssl/crypto.h>
128#include<signal.h>
129#include<sys/ipc.h>
130#include<sys/sem.h>
131#include<sys/wait.h>
132#include<sys/shm.h>
133#include<type_traits>
134#include<charconv>
135#include<any>
136#include <sys/eventfd.h>
137#include <sys/timerfd.h>
138#include <cstddef>
139#include <cstdint>
140#include <new>
141#include <vector>
142#include <memory>
143#include <limits>
144#include <poll.h>
145#include <exception>
146#include <cstdlib>
147#include <cstdio>
148#include <deque>
149#include <algorithm>
150#include <array>
151#include <unordered_set>
152#include <cctype>
153#include <sys/uio.h>
154#include <netinet/tcp.h>
155#ifdef __linux__
156#include <sys/prctl.h>
157#include <sys/syscall.h>
158#endif
162
163namespace stt
164{
165
167 inline constexpr int version_major=0;
168 inline constexpr int version_minor=7;
169 inline constexpr int version_patch=0;
170 inline constexpr std::string_view version="0.7.0";
171
172 namespace system
173 {
174 class WorkerPool;
175
203template <typename T>
205public:
206 explicit MPSCQueue(std::size_t capacity_pow2)
207 : capacity_(capacity_pow2),
208 mask_(capacity_pow2 - 1),
209 buffer_(capacity_pow2),
210 head_(0),
211 tail_(0)
212 {
213 static_assert(std::is_nothrow_move_constructible_v<T>,
214 "MPSCQueue requires a nothrow-move-constructible value type");
215 // capacity must be power of two
216 if (capacity_ < 2 || (capacity_ & mask_) != 0) {
217 // You can replace with your own assert/log
218 throw std::invalid_argument("MPSCQueue capacity must be power of two and >= 2");
219 }
220
221 // Initialize per-slot sequence
222 for (std::size_t i = 0; i < capacity_; ++i) {
223 buffer_[i].seq.store(i, std::memory_order_relaxed);
224 }
225 }
226
227 MPSCQueue(const MPSCQueue&) = delete;
228 MPSCQueue& operator=(const MPSCQueue&) = delete;
229
231 // Drain remaining items to call destructors if needed
232 while (discard_one()) {}
233 }
234
239 bool push(T&& v) noexcept(std::is_nothrow_move_constructible_v<T>) {
240 return emplace_impl(std::move(v));
241 }
242
243 bool push(const T& v) {
244 // Copy before reserving a ring slot. If the copy throws, producer
245 // progress and the per-slot sequence state remain untouched.
246 T copy(v);
247 return emplace_impl(std::move(copy));
248 }
249
254 bool pop(T& out) noexcept(std::is_nothrow_move_assignable_v<T> &&
255 std::is_nothrow_move_constructible_v<T>)
256 {
257 const std::size_t head = head_.load(std::memory_order_relaxed);
258 Slot& slot = buffer_[head & mask_];
259 const std::size_t seq = slot.seq.load(std::memory_order_acquire);
260 const std::intptr_t dif = static_cast<std::intptr_t>(seq) - static_cast<std::intptr_t>(head + 1);
261
262 if (dif != 0) {
263 // seq != head+1 => empty
264 return false;
265 }
266
267 // Move out
268 out = std::move(*slot.ptr());
269
270 // Destroy in-place
271 slot.destroy();
272
273 // Mark slot as free for producers:
274 // seq = head + capacity
275 slot.seq.store(head + capacity_, std::memory_order_release);
276
277 head_.store(head + 1, std::memory_order_relaxed);
278 return true;
279 }
280
285 std::size_t approx_size() const noexcept {
286 const std::size_t t = tail_.load(std::memory_order_acquire);
287 const std::size_t h = head_.load(std::memory_order_acquire);
288 return (t >= h) ? (t - h) : 0;
289 }
290
295 bool possibly_nonempty() const noexcept {
296 return tail_.load(std::memory_order_acquire) !=
297 head_.load(std::memory_order_acquire);
298 }
299
300private:
301 struct Slot {
302 std::atomic<std::size_t> seq;
303 typename std::aligned_storage<sizeof(T), alignof(T)>::type storage;
304 bool has_value = false;
305
306 T* ptr() noexcept { return reinterpret_cast<T*>(&storage); }
307 const T* ptr() const noexcept { return reinterpret_cast<const T*>(&storage); }
308
309 template <class U>
310 void construct(U&& v) noexcept(std::is_nothrow_constructible_v<T, U&&>) {
311 ::new (static_cast<void*>(&storage)) T(std::forward<U>(v));
312 has_value = true;
313 }
314
315 void destroy() noexcept {
316 if (has_value) {
317 ptr()->~T();
318 has_value = false;
319 }
320 }
321 };
322
323 template <class U>
324 bool emplace_impl(U&& v) noexcept(std::is_nothrow_constructible_v<T, U&&>) {
325 std::size_t pos = tail_.load(std::memory_order_relaxed);
326
327 for (;;) {
328 Slot& slot = buffer_[pos & mask_];
329 const std::size_t seq = slot.seq.load(std::memory_order_acquire);
330 const std::intptr_t dif = static_cast<std::intptr_t>(seq) - static_cast<std::intptr_t>(pos);
331
332 if (dif == 0) {
333 // slot is free for this pos
334 if (tail_.compare_exchange_weak(
335 pos, pos + 1,
336 std::memory_order_relaxed,
337 std::memory_order_relaxed))
338 {
339 // We own this slot now
340 slot.construct(std::forward<U>(v));
341 // Publish to consumer: seq = pos+1 means "ready"
342 slot.seq.store(pos + 1, std::memory_order_release);
343 return true;
344 }
345 // CAS failed: pos updated with current tail; retry
346 } else if (dif < 0) {
347 // slot seq < pos => queue is full (producer wrapped)
348 return false;
349 } else {
350 // Another producer is ahead; move pos forward
351 pos = tail_.load(std::memory_order_relaxed);
352 }
353 }
354 }
355
356 bool discard_one() noexcept {
357 const std::size_t head = head_.load(std::memory_order_relaxed);
358 Slot& slot = buffer_[head & mask_];
359 const std::size_t seq = slot.seq.load(std::memory_order_acquire);
360 if (static_cast<std::intptr_t>(seq) - static_cast<std::intptr_t>(head + 1) != 0)
361 return false;
362 slot.destroy();
363 slot.seq.store(head + capacity_, std::memory_order_release);
364 head_.store(head + 1, std::memory_order_relaxed);
365 return true;
366 }
367
368private:
369 const std::size_t capacity_;
370 const std::size_t mask_;
371 std::vector<Slot> buffer_;
372
373 // Single consumer only
374 alignas(64) std::atomic<std::size_t> head_;
375
376 // Multi-producer
377 alignas(64) std::atomic<std::size_t> tail_;
378};
379
380
381 }
382
387 namespace file
388 {
393 {
394 public:
402 static bool createDir(const std::string & ddir,const mode_t &mode=0775);
411 static bool copy(const std::string &sourceFile,const std::string &objectFile);
420 static bool createFile(const std::string &filePath,const mode_t &mode=0666);
427 static size_t get_file_size(const std::string &fileName);
428 };
429
435 {
439 std::string loc;
447 std::mutex lock;
453 FileThreadLock(const std::string &loc,const int &threads):loc(loc),threads(threads){};
454 };
455
462 class File:private FileTool
463 {
464 protected:
465 static std::mutex l1;
466 static std::unordered_map<std::string,FileThreadLock> fl2;
467 protected:
468 std::mutex che;
469
470 private:
471 void lockfl2();
472 void unlockfl2();
473 bool memoryLockOwnedByCurrentThread();
474 void markMemoryLockOwned();
475 void releaseMemoryLocks();
476 private:
477 std::ifstream fin;
478 std::vector<std::string> data;
479 std::vector<std::string> backUp;
480 char *data_binary=nullptr;
481 char *backUp_binary=nullptr;
482 size_t size1=0;
483 size_t size2=0;
484 int multiple=0;
485 size_t multiple_backup=0;
486 size_t malloced=0;
487 std::mutex fl1;
488 std::mutex memoryOwnerMutex;
489 std::thread::id memoryLockOwner{};
490 bool memoryLocked=false;
491
492 std::ofstream fout;
493 std::string fileName;
494
495 std::string fileNameTemp;
496 std::atomic<bool> flag{false};
497 bool binary;
498 mode_t mode;
499 size_t size=0;
500 uint64_t totalLines=0;
501 private:
502 void toMemory();
503 bool toDisk();
504 public:
545 bool openFile(const std::string &fileName,const bool &create=true,const int &multiple=0,const size_t &size=0,const mode_t &mode=0666);
552 bool closeFile(const bool &del=false);
557 ~File(){closeFile(false);}
562 bool isOpen(){return flag.load(std::memory_order_acquire);}
567 bool isBinary(){return binary;}
572 std::string getFileName(){return fileName;}
581 uint64_t getFileLine(){return totalLines;}
590 size_t getFileSize(){return size;}
599 size_t getSize1(){return size1;}
600 public:
607 bool lockMemory();
616 bool unlockMemory(const bool &rec=false);
617 public:
631 int findC(const std::string &targetString,const int linePos=1);
641 bool appendLineC(const std::string &data,const int &linePos=0);
650 bool deleteLineC(const int &linePos=0);
667 bool chgLineC(const std::string &data,const int &linePos=0);
677 bool readLineC(std::string &data,const int linePos);
687 std::string& readC(std::string &data,const int &linePos,const int &num);
694 std::string& readAllC(std::string &data);
710 bool readC(char *data,const size_t &pos,const size_t &size);
721 bool writeC(const char *data,const size_t &pos,const size_t &size);
726 bool formatC();
728 public:
742 int find(const std::string &targetString,const int linePos=1);
752 bool appendLine(const std::string &data,const int &linePos=0);
761 bool deleteLine(const int &linePos=0);
768 bool deleteAll();
778 bool chgLine(const std::string &data,const int &linePos=0);
788 bool readLine(std::string &data,const int linePos);
798 std::string& read(std::string &data,const int &linePos,const int &num);
805 std::string& readAll(std::string &data);
821 bool read(char *data,const size_t &pos,const size_t &size);
832 bool write(const char *data,const size_t &pos,const size_t &size);
837 void format();
839 };
840 }
846 namespace time
847 {
854 struct Duration
855 {
859 long long day;
863 int hour;
867 int min;
871 int sec;
875 int msec;
879 Duration(long long a,int b,int c,int d,int e):day(a),hour(b),min(c),sec(d),msec(e){}
880 Duration()=default;
886 bool operator>(const Duration &b)
887 {
888 long long total;
889 total=day*24*60*60*1000+hour*60*60*1000+min*60*1000+sec*1000+msec;
890 long long totalB;
891 totalB=b.day*24*60*60*1000+b.hour*60*60*1000+b.min*60*1000+b.sec*1000+b.msec;
892 if(total>totalB)
893 return true;
894 else
895 return false;
896 }
897
902 bool operator<(const Duration &b)
903 {
904 long long total;
905 total=day*24*60*60*1000+hour*60*60*1000+min*60*1000+sec*1000+msec;
906 long long totalB;
907 totalB=b.day*24*60*60*1000+b.hour*60*60*1000+b.min*60*1000+b.sec*1000+b.msec;
908 if(total<totalB)
909 return true;
910 else
911 return false;
912 }
913
918 bool operator==(const Duration &b)
919 {
920 long long total;
921 total=day*24*60*60*1000+hour*60*60*1000+min*60*1000+sec*1000+msec;
922 long long totalB;
923 totalB=b.day*24*60*60*1000+b.hour*60*60*1000+b.min*60*1000+b.sec*1000+b.msec;
924 if(total==totalB)
925 return true;
926 else
927 return false;
928 }
929
934 bool operator>=(const Duration &b)
935 {
936 long long total;
937 total=day*24*60*60*1000+hour*60*60*1000+min*60*1000+sec*1000+msec;
938 long long totalB;
939 totalB=b.day*24*60*60*1000+b.hour*60*60*1000+b.min*60*1000+b.sec*1000+b.msec;
940 if(total>=totalB)
941 return true;
942 else
943 return false;
944 }
945
950 bool operator<=(const Duration &b)
951 {
952 long long total;
953 total=day*24*60*60*1000+hour*60*60*1000+min*60*1000+sec*1000+msec;
954 long long totalB;
955 totalB=b.day*24*60*60*1000+b.hour*60*60*1000+b.min*60*1000+b.sec*1000+b.msec;
956 if(total<=totalB)
957 return true;
958 else
959 return false;
960 }
961
967 {
968 long long dayy=day;
969 int hourr=hour;
970 int minn=min;
971 int secc=sec;
972 int msecc=msec;
973
974 msecc+=b.msec;
975 secc+=b.sec;
976 minn+=b.min;
977 hourr+=b.hour;
978 dayy+=b.day;
979
980 if(msecc/1000!=0)
981 {
982 secc+=msecc/1000;
983 msecc=msecc%1000;
984 }
985
986 if(secc/60!=0)
987 {
988 minn+=secc/60;
989 secc=secc%60;
990 }
991
992 if(minn/60!=0)
993 {
994 hourr+=minn/60;
995 minn=minn%60;
996 }
997
998 if(hourr/24!=0)
999 {
1000 dayy+=hourr/24;
1001 hourr=hourr%24;
1002 }
1003 return Duration(dayy,hourr,minn,secc,msecc);
1004 }
1005
1011 {
1012 long long dayy=day;
1013 int hourr=hour;
1014 int minn=min;
1015 int secc=sec;
1016 int msecc=msec;
1017
1018 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;
1019 secc=0;
1020 minn=0;
1021 hourr=0;
1022 dayy=0;
1023
1024 if(msecc/1000!=0)
1025 {
1026 secc+=msecc/1000;
1027 msecc=msecc%1000;
1028 }
1029
1030 if(secc/60!=0)
1031 {
1032 minn+=secc/60;
1033 secc=secc%60;
1034 }
1035
1036 if(minn/60!=0)
1037 {
1038 hourr+=minn/60;
1039 minn=minn%60;
1040 }
1041
1042 if(hourr/24!=0)
1043 {
1044 dayy+=hourr/24;
1045 hourr=hourr%24;
1046 }
1047 return Duration(dayy,hourr,minn,secc,msecc);
1048 }
1049
1054 {
1055 long long total;
1056 total=hour*60*60*1000+min*60*1000+sec*1000+msec;
1057 double k=day+total/86400000.0000;
1058 return k;
1059 }
1060
1064 {
1065 long long total;
1066 total=min*60*1000+sec*1000+msec;
1067 double k=day*24+hour+total/36000000.0000;
1068 return k;
1069 }
1070
1074 {
1075 long long total;
1076 total=sec*1000+msec;
1077 double k=day*24*60+hour*60+min+total/60000.0000;
1078 return k;
1079 }
1080
1084 {
1085 long long total;
1086 total=msec;
1087 double k=day*24*60*60+hour*60*60+min*60+sec+total/1000.0000;
1088 return k;
1089 }
1090
1093 long long convertToMsec()
1094 {
1095 long long total;
1096 total=day*24*60*60*1000+hour*60*60*1000+min*60*1000+sec*1000+msec;
1097 return total;
1098 }
1099
1104 Duration recoverForm(const long long &t)
1105 {
1106 msec=t;
1107 sec=0;
1108 min=0;
1109 hour=0;
1110 day=0;
1111
1112 if(msec/1000!=0)
1113 {
1114 sec+=msec/1000;
1115 msec=msec%1000;
1116 }
1117
1118 if(sec/60!=0)
1119 {
1120 min+=sec/60;
1121 sec=sec%60;
1122 }
1123
1124 if(min/60!=0)
1125 {
1126 hour+=min/60;
1127 min=min%60;
1128 }
1129
1130 if(hour/24!=0)
1131 {
1132 day+=hour/24;
1133 hour=hour%24;
1134 }
1135 return Duration(day,hour,min,sec,msec);
1136 }
1137 };
1138
1149 std::ostream& operator<<(std::ostream &os,const Duration &a);
1150
1151 using Milliseconds = std::chrono::duration<uint64_t,std::milli>;
1152 using Seconds=std::chrono::duration<uint64_t>;
1156 #define ISO8086A "yyyy-mm-ddThh:mi:ss"
1160 #define ISO8086B "yyyy-mm-ddThh:mi:ss.sss"
1161
1162
1170 {
1171 private:
1172 static Duration& dTOD(const Milliseconds& d1,Duration &D1);
1173 static Milliseconds& DTOd(const Duration &D1,Milliseconds& d1);
1174 static std::string &toPGtimeFormat();
1175 static std::chrono::system_clock::time_point strToTimePoint(const std::string &timeStr,const std::string &format=ISO8086A);
1176 static std::string& timePointToStr(const std::chrono::system_clock::time_point &tp,std::string &timeStr,const std::string &format=ISO8086A);
1177 public:
1185 static std::string& getTime(std::string &timeStr,const std::string &format=ISO8086A);
1194 static bool convertFormat(std::string &timeStr,const std::string &oldFormat,const std::string &newFormat=ISO8086A);
1204 static Duration& calculateTime(const std::string &time1,const std::string &time2,Duration &result,const std::string &format1=ISO8086A,const std::string &format2=ISO8086A);
1215 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);
1225 static bool compareTime(const std::string &time1,const std::string &time2,const std::string &format1=ISO8086A,const std::string &format2=ISO8086A);
1226 private:
1227 Duration dt{-1,-1,-1,-1,-1};
1228 bool flag=false;
1229 std::chrono::steady_clock::time_point start;
1230 std::chrono::steady_clock::time_point end;
1231 public:
1248 public:
1253 Duration getDt(){return dt;}
1258 bool isStart(){return flag;}
1259 };
1260 }
1261 namespace file
1262 {
1268 class LogFile:private time::DateTime,protected File
1269 {
1270 private:
1271 std::string timeFormat;
1272 std::string contentFormat;
1273 std::atomic<bool> consumerGuard{true};
1274 std::atomic<bool> logWakePending{false};
1275 std::atomic<uint64_t> droppedLogs{0};
1276 std::mutex queueMutex;
1277 std::condition_variable queueCV;
1279 std::thread consumerThread;
1280 public:
1301 LogFile(const size_t &logQueue_cap=8192):logQueue(logQueue_cap)
1302 {
1303 consumerGuard=true;
1304 consumerThread = std::thread([this]()->void
1305 {
1306 std::string content;
1307 content.reserve(1024);
1308 std::string time;
1309 time.reserve(128);
1310 while (true)
1311 {
1312 while(this->logQueue.pop(content))//非空则执行
1313 {
1314 getTime(time,timeFormat);
1315 time+=contentFormat;
1316 time+=content;
1317 this->appendLine(time);
1318 }
1319 this->logWakePending.store(false,std::memory_order_release);
1320 if(this->logQueue.possibly_nonempty())
1321 {
1322 this->logWakePending.store(true,std::memory_order_release);
1323 continue;
1324 }
1325 if (!this->consumerGuard.load(std::memory_order_acquire))
1326 break;
1327 std::unique_lock<std::mutex> lock(this->queueMutex);
1328 this->queueCV.wait(lock,[this] {
1329 return !this->consumerGuard.load(std::memory_order_acquire)||
1330 this->logWakePending.load(std::memory_order_acquire);
1331 });
1332 }
1333 });
1334 }
1335
1343 bool openFile(const std::string &fileName,const std::string &timeFormat=ISO8086A,const std::string &contentFormat=" ");
1348 bool isOpen(){return File::isOpen();}
1353 std::string getFileName(){return File::getFileName();}
1359 bool closeFile(const bool &del=false);
1364 void writeLog(const std::string &data);
1369 uint64_t getDroppedLogCount() const noexcept{return droppedLogs.load(std::memory_order_relaxed);}
1374 bool clearLog();
1382 bool deleteLogByTime(const std::string &date1="1",const std::string &date2="2");
1387 };
1388 }
1394 namespace data
1395 {
1400 {
1401 public:
1412 static bool encryptSymmetric(const unsigned char *before,const size_t &length,const unsigned char *passwd,const unsigned char *iv,unsigned char *after);
1423 static bool decryptSymmetric(const unsigned char *before,const size_t &length,const unsigned char *passwd,const unsigned char *iv,unsigned char *after);
1436 static std::string& sha1(const std::string &ori_str,std::string &result);
1449 static std::string& sha11(const std::string &ori_str,std::string &result);
1450 };
1451
1455 {
1456 public:
1464 static std::string& bitOutput(char input,std::string &result);
1472 static std::string& bitOutput(const std::string &input,std::string &result);
1481 static char& bitOutput_bit(char input,const int pos,char &result);
1489 static unsigned long& bitStrToNumber(const std::string &input,unsigned long &result);
1499 static unsigned long& bitToNumber(const std::string &input,unsigned long &result);
1507 static char& toBit(const std::string &input,char &result);
1515 static std::string& toBit(const std::string &input,std::string &result);
1516 };
1517
1521 {
1522 public:
1530 static long getRandomNumber(const long &a,const long &b);
1537 static std::string& getRandomStr_base64(std::string &str,const int &length);
1551 static std::string& generateMask_4(std::string &mask);
1552 };
1553
1557 {
1558 public:
1570 static unsigned long& htonl_ntohl_64(unsigned long &data);//64位无符号数转化为大/小端序(网络字节序)
1571 };
1572
1577 {
1578 public:
1579
1588 static std::string& getPreciesFloat(const float &number,const int &bit,std::string &str);
1596 static float& getPreciesFloat(float &number,const int &bit);
1605 static std::string& getPreciesDouble(const double &number,const int &bit,std::string &str);
1613 static double& getPreciesDouble(double &number,const int &bit);
1625 static float& getValidFloat(float &number,const int &bit);
1626 };
1627
1632 {
1633 public:
1650 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);
1661 static std::string_view& get_value_str(const std::string_view& ori_str,std::string_view &str,const std::string& name);
1670 static std::string_view& get_value_header(const std::string_view& ori_str,std::string_view &str,const std::string& name);
1680 static std::string_view& get_location_str(const std::string_view& ori_str,std::string_view &str);
1690 static std::string_view& getLocPara(const std::string_view &url,std::string_view &locPara);
1699 static std::string_view& getPara(const std::string_view &url,std::string_view &para);
1700
1701
1718 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);
1729 static std::string& get_value_str(const std::string& ori_str,std::string &str,const std::string& name);
1738 static std::string& get_value_header(const std::string& ori_str,std::string &str,const std::string& name);
1748 static std::string& get_location_str(const std::string& ori_str,std::string &str);
1758 static std::string& getLocPara(const std::string &url,std::string &locPara);
1767 static std::string& getPara(const std::string &url,std::string &para);
1778 static std::string& getIP(const std::string &url,std::string &IP);
1789 static int& getPort(const std::string &url,int &port);
1799 static std::string createHeader(const std::string& first,const std::string& second);
1820 template<class... Args>
1821 static std::string createHeader(const std::string& first,const std::string& second,Args... args)
1822 {
1823 std::string cf=first+": "+second+"\r\n"+createHeader(args...);
1824 return cf;
1825 }
1826 };
1827
1831 {
1832 public:
1844 static std::string& transfer_websocket_key(std::string &str);
1845 };
1846
1850 {
1851 public:
1860 static int& toInt(const std::string_view&ori_str,int &result,const int &i=-1);
1868 static int& str16toInt(const std::string_view&ori_str,int &result,const int &i=-1);
1877 static long& toLong(const std::string_view&ori_str,long &result,const long &i=-1);
1886 static float& toFloat(const std::string&ori_str,float &result,const float &i=-1);
1895 static double& toDouble(const std::string&ori_str,double &result,const double &i=-1);
1903 static bool& toBool(const std::string_view&ori_str,bool &result);
1914 static std::string& strto16(const std::string &ori_str,std::string &result);// Convert bytes to a lowercase hexadecimal string
1915 };
1916
1920 {
1921 public:
1930 static std::string base64_encode(const std::string &input);
1939 static std::string base64_decode(const std::string &input);
1951 static std::string& transfer_websocket_key(std::string &str);
1965 static std::string& generateMask_4(std::string &mask);
1976 static std::string& maskCalculate(std::string &data,const std::string &mask);
1977 };
1978
1982 {
1983 public:
1996 static int getValue(const std::string &oriStr,std::string& result,const std::string &type="value",const std::string &name="a",const int &num=0);
1997
2003 static std::string toString(const Json::Value &val);
2009 static Json::Value toJsonArray(const std::string & str);
2019 template<class T1,class T2>
2020 static std::string createJson(T1 first,T2 second)
2021 {
2022 Json::Value root;
2023 //root[first]=second;
2024 if constexpr (std::is_integral_v<T2>) {
2025 root[first] = Json::Value(static_cast<Json::Int64>(second));
2026 } else {
2027 root[first] = second;
2028 }
2029 Json::StreamWriterBuilder builder;
2030 std::string jsonString=Json::writeString(builder,root);
2031 return jsonString;
2032 }
2033
2044 template<class T1,class T2,class... Args>
2045 static std::string createJson(T1 first,T2 second,Args... args)
2046 {
2047 Json::Value root;
2048 //root[first]=second;
2049 if constexpr (std::is_integral_v<T2>) {
2050 root[first] = Json::Value(static_cast<Json::Int64>(second));
2051 } else {
2052 root[first] = second;
2053 }
2054 std::string kk=createJson(args...);
2055 Json::StreamWriterBuilder builder;
2056 std::string jsonString=Json::writeString(builder,root);
2057 jsonString=jsonString.erase(jsonString.length()-2);
2058 kk=kk.substr(1);
2059 return jsonString+","+kk;
2060
2061 }
2062
2069 template<class T>
2070 static std::string createArray(T first)
2071 {
2072 Json::Value root(Json::arrayValue);
2073 root.append(first);
2074 Json::StreamWriterBuilder builder;
2075 std::string jsonString=Json::writeString(builder,root);
2076 return jsonString;
2077 }
2078
2087 template<class T,class... Args>
2088 static std::string createArray(T first,Args... args)
2089 {
2090 Json::Value root(Json::arrayValue);
2091 root.append(first);
2092 std::string kk=createArray(args...);
2093 Json::StreamWriterBuilder builder;
2094 std::string jsonString=Json::writeString(builder,root);
2095 jsonString=jsonString.erase(jsonString.length()-2);
2096 kk=kk.substr(1);
2097 return jsonString+","+kk;
2098
2099 }
2100
2106 static std::string jsonAdd(const std::string &a,const std::string &b);
2113 static std::string& jsonFormatify(const std::string &a,std::string &b);
2120 static std::string& jsonToUTF8(const std::string &input,std::string &output);
2121 };
2122 }
2123
2127 namespace security
2128 {
2173 enum class RateLimitType
2174 {
2175 Cooldown, // 连续触发惩罚:达到上限后进入冷却,需要安静 secs 才恢复
2176 FixedWindow, // 固定窗口计数:每 secs 一个窗口,窗口内最多 times 次
2177 SlidingWindow, // 滑动窗口:统计最近 secs 内的次数(队列时间戳)
2178 TokenBucket // 令牌桶:允许突发 + 控制长期平均速率(常用于 API/消息)
2179 };
2180
2200 {
2201 // 通用
2202 int counter = 0;
2203 int violations = 0; // 新增:触发限流的次数
2204 std::chrono::steady_clock::time_point lastTime{};
2205
2206 // SlidingWindow
2207 std::deque<std::chrono::steady_clock::time_point> history;
2208
2209 // TokenBucket
2210 double tokens = 0.0;
2211 std::chrono::steady_clock::time_point lastRefill{};
2212 };
2213
2230 {
2231 int fd = -1;
2233 std::unordered_map<std::string, RateState> pathRate;
2234 std::chrono::steady_clock::time_point lastActivity{};
2235 };
2236
2260 {
2263 int badScore = 0; //IP 风险评分(用于升级惩罚)
2264 std::unordered_map<int, ConnectionState> conns; // fd -> state
2265 };
2266
2288 {
2289 ALLOW = 0, // 正常通过
2290 DROP = 1, // 不回应(丢弃)
2291 CLOSE = 2 // 断连(可伴随封 IP)
2292 };
2293
2382 {
2383 public:
2390 ConnectionLimiter(const int& maxConn = 20, const int& idleTimeout = 60) : maxConnections(maxConn),connectionTimeout(idleTimeout){}
2391
2392 // ========== 策略设置 ==========
2414
2415 // ========== Path 配置 ==========
2428 void setPathLimit(const std::string &path, const int &times, const int &secs);
2429
2430 // ========== 核心判断 ==========
2447 DefenseDecision allowConnect(const std::string &ip, const int &fd,const int &times, const int &secs);
2462 DefenseDecision allowRequest(const std::string &ip,const int &fd,const std::string_view &path,const int &times,const int &secs);
2463
2464 // ========== 生命周期 ==========
2475 void clearIP(const std::string &ip,const int &fd);
2489 bool connectionDetect(const std::string &ip,const int &fd);
2520 void banIP(const std::string &ip,int banSeconds,const std::string &reasonCN,const std::string &reasonEN);
2524 void unbanIP(const std::string &ip);
2528 bool isBanned(const std::string &ip) const;
2529
2530
2531 private:
2532 // 核心判定
2533 bool allow(RateState &st,const RateLimitType &type,const int &times,const int &secs,const std::chrono::steady_clock::time_point &now);
2534
2535 private:
2536 int maxConnections;
2537 int connectionTimeout;
2538
2539 RateLimitType connectStrategy = RateLimitType::Cooldown;
2542
2543 std::unordered_map<std::string, IPInformation> table;
2544 std::unordered_map<std::string, std::pair<int,int>> pathConfig;
2545 // IP -> 解封时间
2546 std::unordered_map<std::string,std::chrono::steady_clock::time_point> blacklist;
2547 inline void logSecurity(const std::string &msgCN,const std::string &msgEN);
2548 };
2549
2550
2551
2552 }
2553
2559 namespace network
2560 {
2565 {
2566 protected:
2567 int fd=-1;
2568 bool flag1=false;
2569 bool flag2=false;
2570 SSL *ssl=nullptr;
2571 int sec=-1;
2572 std::function<int(std::string)> queuedSendFunction;
2573 std::function<void()> queuedCloseFunction;
2574 public:
2578 bool flag3=false;
2579 public:
2589 void setFD(const int &fd,SSL *ssl,const bool &flag1=false,const bool &flag2=false,const int &sec=-1);
2597 void setTransportFunctions(std::function<int(std::string)> sendFunction,std::function<void()> closeFunction={})
2598 {
2599 queuedSendFunction=std::move(sendFunction);
2600 queuedCloseFunction=std::move(closeFunction);
2601 }
2602
2606 int getFD(){return fd;}
2611 SSL *getSSL(){return ssl;}
2616 void close(const bool &cle=true);
2621 void blockSet(const int &sec = -1);
2634 bool isConnect(){if(fd==-1)return false;else return true;}
2635 public:
2657 int sendData(const std::string &data,const bool &block=true);
2679 int sendData(const char *data,const uint64_t &length,const bool &block=true);
2695 int recvDataByLength(std::string &data,const uint64_t &length,const int &sec=2);
2711 int recvDataByLength(char *data,const uint64_t &length,const int &sec=2);
2724 int recvData(std::string &data,const uint64_t &length);
2737 int recvData(char *data,const uint64_t &length);
2738 };
2739
2745 {
2746 private:
2747 std::string serverIP="";
2748 int serverPort=-1;
2749 bool flag=false;
2750 bool TLS;
2751 SSL_CTX *ctx=nullptr;
2752 const char *ca;
2753 const char *cert;
2754 const char *key;
2755 const char *passwd;
2756 private:
2757 bool createFD();
2758 void closeAndUnCreate();
2759 bool initCTX(const char *ca,const char *cert="",const char *key="",const char *passwd="");
2760 public:
2773 TcpClient(const bool &TLS=false,const char *ca="",const char *cert="",const char *key="",const char *passwd="");
2781 bool connect(const std::string &ip,const int &port);
2795 void resetCTX(const bool &TLS=false,const char *ca="",const char *cert="",const char *key="",const char *passwd="");
2800 bool close();
2804 ~TcpClient(){closeAndUnCreate();}
2805 public:
2810 std::string getServerIP(){return serverIP;}
2815 int getServerPort(){return serverPort;}
2820 bool isConnect(){return flag;}
2821 };
2822
2830 class HttpClient:private TcpClient
2831 {
2832 private:
2833 bool flag=false;
2834 public:
2847 HttpClient(const bool &TLS=false,const char *ca="",const char *cert="",const char *key="",const char *passwd=""):TcpClient(TLS,ca,cert,key,passwd){}
2848 public:
2861 bool getRequest(const std::string &url,const std::string &header="",const std::string &header1="Connection: keep-alive",const int &sec=-1);
2875 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);
2890 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);
2906 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);
2907 public:
2912 bool isReturn(){return flag;}
2916 std::string header="";
2920 std::string body="";
2921 };
2922
2928 {
2929 private:
2930 int fd=-1;
2931 bool flag=true;
2932 std::function<bool(const int &fd)> fc=[](const int &)->bool
2933 {return true;};
2934 std::function<void(const int &fd)> fcEnd=[](const int &)->void
2935 {};
2936 std::function<bool(const int &fd)> fcTimeOut=[](const int &)->bool
2937 {return true;};
2938 std::atomic<bool> flag1{true};
2939 std::atomic<bool> flag2{false};
2940 time::Duration dt{0,20,0,0,0};
2941 std::atomic<bool> flag3{false};
2943 std::thread listenerThread;
2944 int controlFD=-1;
2945 std::mutex callbackMutex;
2946 std::mutex countdownMutex;
2947 private:
2948 void epolll();
2949 public:
2958 void startListen(const int &fd,const bool &flag=true,const time::Duration &dt=time::Duration{0,0,20,0,0});
2959 public:
2964 bool isListen(){return flag2.load(std::memory_order_acquire);}
2974 void setFunction(std::function<bool(const int &fd)> fc){std::lock_guard<std::mutex> lock(callbackMutex);this->fc=std::move(fc);}
2982 void setEndFunction(std::function<void(const int &fd)> fcEnd){std::lock_guard<std::mutex> lock(callbackMutex);this->fcEnd=std::move(fcEnd);};
2992 void setTimeOutFunction(std::function<bool(const int &fd)> fcTimeOut){std::lock_guard<std::mutex> lock(callbackMutex);this->fcTimeOut=std::move(fcTimeOut);};
3010 void waitAndQuit(const time::Duration &t=time::Duration{0,0,0,10,10})
3011 {
3012 std::lock_guard<std::mutex> lock(countdownMutex);
3013 this->t=t;
3014 flag3.store(true,std::memory_order_release);
3015 }
3016
3021 };
3022
3029 {
3030 private:
3031 bool flag4=false;
3032 std::function<bool(const std::string &message,WebSocketClient &k)> fc=[](const std::string &message,WebSocketClient &)->bool
3033 {std::cout<<"收到: "<<message<<std::endl;return true;};
3034 std::string url;
3035 EpollSingle k;
3036 bool flag5=false;
3037 private:
3038 bool close1();
3039 public:
3052 WebSocketClient(const bool &TLS=false,const char *ca="",const char *cert="",const char *key="",const char *passwd=""):TcpClient(TLS,ca,cert,key,passwd){}
3063 void setFunction(std::function<bool(const std::string &message,WebSocketClient &k)> fc){this->fc=fc;}
3070 bool connect(const std::string &url,const int &min=20);
3093 bool sendMessage(const std::string &message,const std::string &type="0001");
3103 void close(const std::string &closeCodeAndMessage,const bool &wait=true);
3121 void close(const short &code=1000,const std::string &message="bye",const bool &wait=true);
3122 public:
3127 bool isConnect(){return flag4;}
3132 std::string getUrl(){return url;}
3137 std::string getServerIp(){return TcpClient::getServerIP();}
3143 std::string getServerPort(){return std::to_string(TcpClient::getServerPort());}
3153 };
3154
3159 {
3163 int fd=-1;
3171 std::string type;
3175 std::string locPara;
3179 std::string loc;
3183 std::string para;
3187 std::string header;
3191 std::string body;
3195 std::string body_chunked;
3199 std::unordered_map<std::string,std::any> ctx;
3200
3207 std::string_view headerValue(std::string_view name) const noexcept;
3208
3213 std::string_view bodyView() const noexcept;
3214 };
3215
3216 struct TcpFDInf;
3222 {
3223 public:
3231 void setFD(const int &fd,SSL *ssl=nullptr,const bool &flag1=false,const bool &flag2=true){TcpFDHandler::setFD(fd,ssl,flag1,flag2);}
3244 int solveRequest(TcpFDInf &TcpInf,HttpRequestInformation &HttpInf,const unsigned long &buffer_size,const int &times=1,const unsigned long &max_header_size=64UL*1024UL);
3253 bool sendBack(const std::string &data,const std::string &header="",const std::string &code="200 OK",const std::string &header1="");
3254
3262 bool sendText(const std::string &data,const std::string &code="200 OK",
3263 const std::string &contentType="text/plain; charset=utf-8",
3264 const std::string &extraHeaders="");
3265
3269 bool sendJson(const Json::Value &data,const std::string &code="200 OK",
3270 const std::string &extraHeaders="");
3271
3277 bool redirect(const std::string &location,const std::string &code="302 Found");
3289 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);
3290 };
3291
3295 {
3299 int fd=-1;
3307 bool closeflag=false;
3311 std::string locPara;
3315 std::string header;
3319 time_t HBTime=0;
3323 time_t response=0;
3327 size_t recv_length=0;
3339 std::string message="";
3343 bool fin=true;
3351 std::string mask;
3355 std::unordered_map<std::string,std::any> ctx;
3360 };
3361
3366 {
3370 int fd=-1;
3378 std::string data;
3382 std::unordered_map<std::string,std::any> ctx;
3383 };
3384
3385 enum class TLSState : uint8_t {
3386 NONE = 0, // 非 TLS 连接(普通 TCP)
3387 HANDSHAKING, // TLS 握手中(SSL_accept 还没完成)
3388 ESTABLISHED, // TLS 已建立,可以 SSL_read / SSL_write
3389 ERROR // TLS 出错(可选)
3390 };
3391
3393 enum class TLSClientAuthMode : uint8_t {
3394 None = 0,
3397 };
3398
3431
3450
3456 {
3457 std::mutex mutex;
3458 std::deque<std::string> queue;
3459 size_t front_offset=0;
3460 size_t queued_bytes=0;
3461 size_t max_queued_bytes=4UL*1024UL*1024UL;
3462 int fd=-1;
3465 bool close_requested=false;
3467 bool overflowed=false;
3468 bool closed=false;
3469 };
3470
3473 {
3474 int fd=-1;
3476 };
3477
3482 {
3486 int fd=-1;
3494 std::string ip;
3498 std::string port;
3502 int FDStatus=-1;
3506 std::queue<std::any> pendindQueue;
3510 int status=0;
3514 std::string_view data;
3518 SSL* ssl=nullptr;
3526 char *buffer=nullptr;
3530 unsigned long p_buffer_now=0;
3532 unsigned long buffer_capacity=0;
3536 bool closing=false;
3537 std::shared_ptr<ConnectionWriteState> write_state;
3538 bool write_interest=false;
3540 };
3541
3546 {
3550 int fd=-1;
3556 int ret=-2;
3558 std::shared_ptr<void> request;
3559 };
3560
3561
3567 {
3568 protected:
3572 unsigned long buffer_size;
3573 unsigned long long maxFD;
3575 //std::unordered_map<int,TcpFDInf> clientfd;
3576 //std::mutex lc1;
3577 std::unordered_map<int,TcpFDInf> clientfd;
3578 std::atomic<bool> flag1{false};
3579 //std::queue<QueueFD> *fdQueue;
3580 //std::mutex *lq1;
3581 //std::condition_variable cv1;
3582 //std::condition_variable *cv;
3583 //int consumerNum;
3584 //std::mutex lco1;
3586 SSL_CTX *ctx=nullptr;
3587 bool TLS=false;
3588 mutable std::mutex tlsContextMutex;
3589 //std::unordered_map<int,SSL*> tlsfd;
3590 //std::mutex ltl1;
3592 //bool flag_detect;
3593 //bool flag_detect_status;
3594 std::atomic<int> workerEventFD{-1};
3595 std::atomic<bool> workerWakePending{false};
3596 std::recursive_mutex lifecycleMutex;
3597 std::thread reactorThread;
3599 std::condition_variable reactorStartupCV;
3602 std::atomic<bool> gracefulDrainRequested{false};
3604 std::condition_variable gracefulShutdownCV;
3606 std::deque<WorkerMessage> overflowFinishQueue;
3608 std::deque<SendReadyMessage> overflowSendReadyQueue;
3610 std::unordered_map<int,std::weak_ptr<ConnectionWriteState>> writeRegistry;
3611 std::deque<SendReadyMessage> bufferedReadQueue;
3612 std::deque<SendReadyMessage> timeoutCandidates;
3613 int serverType; // 1 tcp 2 http 3 websocket
3620 size_t maxPendingWriteBytes=4UL*1024UL*1024UL;
3621 size_t writeBudgetPerEvent=256UL*1024UL;
3622 size_t maxHttpHeaderBytes=64UL*1024UL;
3628 std::atomic<uint64_t> metricAcceptedConnections{0};
3629 std::atomic<uint64_t> metricActiveConnections{0};
3630 std::atomic<uint64_t> metricClosedConnections{0};
3631 std::atomic<uint64_t> metricRejectedConnections{0};
3632 std::atomic<uint64_t> metricAcceptErrors{0};
3633 std::atomic<uint64_t> metricTLSHandshakeFailures{0};
3634 std::atomic<uint64_t> metricParsedHttpRequests{0};
3635 std::atomic<uint64_t> metricQueuedWriteBytes{0};
3636 std::atomic<uint64_t> metricSentBytes{0};
3637 std::atomic<uint64_t> metricPendingWriteBytes{0};
3638 std::atomic<uint64_t> metricPeakPendingWriteBytes{0};
3639 std::atomic<uint64_t> metricPeakPendingWorkerTasks{0};
3640 std::atomic<uint64_t> metricWriteOverflows{0};
3641 std::atomic<uint64_t> metricWorkerQueueOverflows{0};
3642 std::atomic<uint64_t> metricSendReadyQueueOverflows{0};
3643 std::atomic<uint64_t> metricWorkerTaskRejections{0};
3644 std::atomic<uint64_t> metricReactorWakeups{0};
3645 std::atomic<uint64_t> metricReactorWakeupsCoalesced{0};
3646 std::atomic<uint64_t> metricWriteSyscalls{0};
3647 std::atomic<uint64_t> metricBatchedWriteSyscalls{0};
3648 std::atomic<uint64_t> metricBatchedWriteBuffers{0};
3649 std::atomic<uint64_t> metricIdleTimeoutChecks{0};
3650 std::atomic<uint64_t> metricIdleTimeoutCloses{0};
3651 std::atomic<uint64_t> metricGracefulShutdownTimeouts{0};
3652 private:
3653 std::function<void(const int &fd)> closeFun=[](const int &)->void
3654 {
3655
3656 };
3657 std::function<void(TcpFDHandler &k,TcpInformation &inf)> securitySendBackFun=[](TcpFDHandler &,TcpInformation &)->void
3658 {};
3659 std::function<bool(TcpFDHandler &k,TcpInformation &inf)> globalSolveFun=[](TcpFDHandler &,TcpInformation &)->bool
3660 {return true;};
3661 std::unordered_map<std::string,std::vector<std::function<int(TcpFDHandler &k,TcpInformation &inf)>>> solveFun;
3662 std::function<int(TcpFDHandler &k,TcpInformation &inf)> parseKey=[](TcpFDHandler &,TcpInformation &inf)->int
3663 {inf.ctx["key"]=inf.data;return 1;};
3664 int fd=-1;
3665 std::atomic<int> port{-1};
3666 std::atomic<bool> flag{false};
3667 std::atomic<bool> flag2{true};
3668 private:
3669 void epolll(const int &evsNum,const int &listenFD);
3670 //virtual void consumer(const int &threadID);
3671 virtual void handler_netevent(const int &fd);
3672 virtual void handler_workerevent(WorkerMessage message);
3673 virtual void handleHeartbeat()=0;
3674 virtual void onConnectionClosed(const int &fd) {(void)fd;}
3675 protected:
3677 int enqueueWrite(const std::shared_ptr<ConnectionWriteState> &state,std::string data);
3678 void requestQueuedClose(const std::shared_ptr<ConnectionWriteState> &state);
3679 void requestCloseAfterFlush(const int &fd,const uint64_t expectedConnection=0);
3680 void publishSendReady(const std::shared_ptr<ConnectionWriteState> &state);
3681 void notifyReactor() noexcept;
3684 void drainReactorWork(const int &epollFD);
3685 size_t drainWorkerResults(const size_t budget);
3686 size_t drainSendReady(const int &epollFD,const size_t budget);
3687 void applyAcceptedSocketOptions(const int &acceptedFD) const noexcept;
3688 void reportReactorStartup(const bool success);
3690 void prepareHandler(TcpFDHandler &handler,const int &fd);
3691 void prepareQueuedHandler(TcpFDHandler &handler,const int &fd);
3692 void prepareQueuedHandler(TcpFDHandler &handler,const int &fd,const uint64_t expectedConnection);
3694 bool updateConnectionEvents(const int &epollFD,TcpFDInf &connection,const bool &wantWrite);
3695 void handleSendReady(const int &epollFD,SendReadyMessage message);
3698 void scheduleBufferedRead(const int &fd,const uint64_t connection);
3699 public:
3712 void putTask(const std::function<int(TcpFDHandler &k,TcpInformation &inf)> &fun,TcpFDHandler &k,TcpInformation &inf);
3729 TcpServer(const unsigned long long &maxFD=1000000,const int &buffer_size=256,const size_t &finishQueue_cap=65536,const bool &security_open=true,
3730 const int &connectionNumLimit=20,const int &connectionSecs=1,const int &connectionTimes=6,const int &requestSecs=1,const int &requestTimes=40,
3731 const int &checkFrequency=60,const int &connectionTimeout=60):
3732 finishQueue(finishQueue_cap),sendReadyQueue(finishQueue_cap),buffer_size(buffer_size>0?static_cast<unsigned long>(buffer_size)*1024UL:256UL*1024UL),
3733 maxFD(maxFD>0?maxFD:1'000'000ULL),connectionLimiter(connectionNumLimit,connectionTimeout),security_open(security_open),
3736
3742 bool startListen(const int &port,const int &threads=8);
3753 bool setTLS(const char *cert,const char *key,const char *passwd,const char *ca);
3761 bool setTLS(const char *cert,const char *key,const char *passwd="");
3771 bool setTLS(const char *cert,const char *key,const char *passwd,const char *ca,
3772 TLSClientAuthMode clientAuth);
3785 void setSecuritySendBackFun(std::function<void(TcpFDHandler &k,TcpInformation &inf)> fc){this->securitySendBackFun=fc;}
3794 void setGlobalSolveFunction(std::function<bool(TcpFDHandler &k,TcpInformation &inf)> fc){this->globalSolveFun=fc;}
3805 void setFunction(const std::string &key,std::function<int(TcpFDHandler &k,TcpInformation &inf)> fc)
3806 {
3807 auto [it, inserted] = solveFun.try_emplace(key);
3808 it->second.push_back(std::move(fc));
3809 }
3810
3819 void setGetKeyFunction(std::function<int(TcpFDHandler &k,TcpInformation &inf)> parseKeyFun){this->parseKey=parseKeyFun;}
3834 virtual bool close();
3841 virtual bool close(const int &fd);
3848 void setConnectStrategy(const stt::security::RateLimitType &type){this->connectionLimiter.setConnectStrategy(type);}
3855 void setRequestStrategy(const stt::security::RateLimitType &type){this->connectionLimiter.setRequestStrategy(type);}
3863 void setPathStrategy(const stt::security::RateLimitType &type){this->connectionLimiter.setPathStrategy(type);}
3877 void setPathLimit(const std::string &path, const int &times, const int &secs){this->connectionLimiter.setPathLimit(path,times,secs);}
3881 void setCloseFun(std::function<void(const int &fd)> closeFun){this->closeFun=closeFun;}
3887 void setMaxPendingWriteBytes(const size_t bytes){if(bytes>0)maxPendingWriteBytes=bytes;}
3893 void setWriteBudgetPerEvent(const size_t bytes){if(bytes>0)writeBudgetPerEvent=bytes;}
3899 void setMaxHttpHeaderBytes(const size_t bytes){if(bytes>=1024)maxHttpHeaderBytes=bytes;}
3905 void setMaxPendingWorkerTasks(const size_t tasks){if(tasks>0)maxPendingWorkerTasks=tasks;}
3912 void setReactorMessageBudgets(const size_t workerCompletions,const size_t sendReadyNotifications)
3913 {
3914 if(workerCompletions>0)workerCompletionBudgetPerWake=workerCompletions;
3915 if(sendReadyNotifications>0)sendReadyBudgetPerWake=sendReadyNotifications;
3916 }
3917
3923 {
3924 socketOptions=options;
3925 if(socketOptions.receive_buffer_bytes<0)socketOptions.receive_buffer_bytes=0;
3926 if(socketOptions.send_buffer_bytes<0)socketOptions.send_buffer_bytes=0;
3927 if(socketOptions.keep_alive_idle_seconds<0)socketOptions.keep_alive_idle_seconds=0;
3928 if(socketOptions.keep_alive_interval_seconds<0)socketOptions.keep_alive_interval_seconds=0;
3929 if(socketOptions.keep_alive_probe_count<0)socketOptions.keep_alive_probe_count=0;
3930 if(socketOptions.defer_accept_seconds<0)socketOptions.defer_accept_seconds=0;
3931 if(socketOptions.fast_open_queue<0)socketOptions.fast_open_queue=0;
3932 if(socketOptions.listen_backlog<0)socketOptions.listen_backlog=0;
3933 }
3934
3940 void setGracefulShutdownTimeout(const size_t milliseconds){gracefulShutdownTimeoutMs=milliseconds;}
3947 {
3948 return {
3949 metricAcceptedConnections.load(std::memory_order_relaxed),
3950 metricActiveConnections.load(std::memory_order_relaxed),
3951 metricClosedConnections.load(std::memory_order_relaxed),
3952 metricRejectedConnections.load(std::memory_order_relaxed),
3953 metricAcceptErrors.load(std::memory_order_relaxed),
3954 metricTLSHandshakeFailures.load(std::memory_order_relaxed),
3955 metricParsedHttpRequests.load(std::memory_order_relaxed),
3956 metricQueuedWriteBytes.load(std::memory_order_relaxed),
3957 metricSentBytes.load(std::memory_order_relaxed),
3958 metricPendingWriteBytes.load(std::memory_order_relaxed),
3959 metricPeakPendingWriteBytes.load(std::memory_order_relaxed),
3960 metricPeakPendingWorkerTasks.load(std::memory_order_relaxed),
3961 metricWriteOverflows.load(std::memory_order_relaxed),
3962 metricWorkerQueueOverflows.load(std::memory_order_relaxed),
3963 metricSendReadyQueueOverflows.load(std::memory_order_relaxed),
3964 metricWorkerTaskRejections.load(std::memory_order_relaxed),
3965 metricReactorWakeups.load(std::memory_order_relaxed),
3966 metricReactorWakeupsCoalesced.load(std::memory_order_relaxed),
3967 metricWriteSyscalls.load(std::memory_order_relaxed),
3968 metricBatchedWriteSyscalls.load(std::memory_order_relaxed),
3969 metricBatchedWriteBuffers.load(std::memory_order_relaxed),
3970 metricIdleTimeoutChecks.load(std::memory_order_relaxed),
3971 metricIdleTimeoutCloses.load(std::memory_order_relaxed),
3972 metricGracefulShutdownTimeouts.load(std::memory_order_relaxed)
3973 };
3974 }
3975 public:
3980 bool isListen(){return flag.load(std::memory_order_acquire);}
3985 int getListenPort() const noexcept{return port.load(std::memory_order_acquire);}
3992 SSL* getSSL(const int &fd);
3998 };
3999
4000
4001
4008 {
4009 private:
4010 std::function<void(HttpServerFDHandler &k,HttpRequestInformation &inf)> securitySendBackFun=[](HttpServerFDHandler &,HttpRequestInformation &)->void
4011 {};
4012 std::vector<std::function<int(HttpServerFDHandler &k,HttpRequestInformation &inf)>> globalSolveFun;
4013 //std::function<bool(HttpServerFDHandler &k,HttpRequestInformation &inf)> globalSolveFun={};
4014 std::unordered_map<std::string,std::vector<std::function<int(HttpServerFDHandler &k,HttpRequestInformation &inf)>>> solveFun;
4015 std::function<int(HttpServerFDHandler &k,HttpRequestInformation &inf)> parseKey=[](HttpServerFDHandler &,HttpRequestInformation &inf)->int
4016 {inf.ctx["key"]=inf.loc;return 1;};
4017 //std::function<bool(const HttpRequestInformation &inf,HttpServerFDHandler &k)> fc;
4018 //HttpRequestInformation *HttpInf;
4019 std::unordered_map<int,HttpRequestInformation> httpinf;
4020 private:
4021 //void consumer(const int &threadID);
4022 //inline void handler(const int &fd);
4023 void handler_netevent(const int &fd) override;
4024 void handler_workerevent(WorkerMessage message) override;
4025 void handleHeartbeat() override {}
4026 public:
4027 using TcpServer::close;
4041
4058 HttpServer(const unsigned long long &maxFD=1000000,const int &buffer_size=256,const size_t &finishQueue_cap=65536,const bool &security_open=true,
4059 const int &connectionNumLimit=10,const int &connectionSecs=1,const int &connectionTimes=3,const int &requestSecs=1,const int &requestTimes=20,
4060 const int &checkFrequency=30,const int &connectionTimeout=30):TcpServer(
4061 maxFD,
4063 finishQueue_cap,
4065 connectionNumLimit,
4071 connectionTimeout
4072 ){serverType=2;}
4073
4081 void setSecuritySendBackFun(std::function<void(HttpServerFDHandler &k,HttpRequestInformation &inf)> fc){this->securitySendBackFun=fc;}
4090 void setGlobalSolveFunction(std::function<int(HttpServerFDHandler &k,HttpRequestInformation &inf)> fc){globalSolveFun.push_back(std::move(fc));}
4117 void setFunction(const std::string &key,std::function<int(HttpServerFDHandler &k,HttpRequestInformation &inf)> fc)
4118 {
4119 auto [it, inserted] = solveFun.try_emplace(key);
4120 it->second.push_back(std::move(fc));
4121 }
4122
4137 void setGetKeyFunction(std::function<int(HttpServerFDHandler &k,HttpRequestInformation &inf)> parseKeyFun){this->parseKey=parseKeyFun;}
4144 bool startListen(const int &port,const int &threads=8)
4145 {
4146 return TcpServer::startListen(port,threads);
4147 }
4148 bool close() override;
4149 bool close(const int &fd) override;
4154 {
4155 close();
4156 }
4157 };
4158
4163 {
4164 public:
4172 void setFD(const int &fd,SSL *ssl=nullptr,const bool &flag1=false,const bool &flag2=true){TcpFDHandler::setFD(fd,ssl,flag1,flag2);}
4189 int getMessage(TcpFDInf &Tcpinf,WebSocketFDInformation &Websocketinf,const unsigned long &buffer_size,const int &ii=1);
4205 bool sendMessage(const std::string &msg,const std::string &type="0001");
4206
4207 };
4208
4214 {
4215 private:
4216 std::unordered_map<int,WebSocketFDInformation> wbclientfd;
4217 std::mutex websocketRegistryMutex;
4218 std::unordered_map<int,uint64_t> websocketConnections;
4219 std::unordered_set<int> websocketClosing;
4220 std::function<void(WebSocketServerFDHandler &k,WebSocketFDInformation &inf)> securitySendBackFun=[](WebSocketServerFDHandler &,WebSocketFDInformation &)->void
4221 {};
4222 //std::function<bool(const std::string &msg,WebSocketServer &k,const WebSocketFDInformation &inf)> fc=[](const std::string &message,WebSocketServer &k,const WebSocketFDInformation &inf)->bool
4223 //{std::cout<<"收到: "<<message<<std::endl;return true;};
4224 std::function<bool(WebSocketFDInformation &k)> fcc=[](WebSocketFDInformation &)
4225 {return true;};
4227 {
4228 return true;
4229 };
4230 std::function<bool(WebSocketServerFDHandler &k,WebSocketFDInformation &inf)> globalSolveFun=[](WebSocketServerFDHandler &,WebSocketFDInformation &)->bool
4231 {return true;};
4232 std::unordered_map<std::string,std::vector<std::function<int(WebSocketServerFDHandler &k,WebSocketFDInformation &inf)>>> solveFun;
4233 std::function<int(WebSocketServerFDHandler &k,WebSocketFDInformation &inf)> parseKey=[](WebSocketServerFDHandler &,WebSocketFDInformation &inf)->int
4234 {inf.ctx["key"]=inf.message;return 1;};
4235 int seca=20*60;
4236 int secb=30;
4237
4238 private:
4239 void handler_netevent(const int &fd) override;
4240 void handler_workerevent(WorkerMessage message) override;
4241 //void consumer(const int &threadID);
4242 //inline void handler(const int &fd);
4243 void closeAck(const int &fd,const std::string &closeCodeAndMessage);
4244 void closeAck(const int &fd,const short &code=1000,const std::string &message="bye");
4245
4246 void handleHeartbeat() override;
4247 void onConnectionClosed(const int &fd) override;
4248 bool sendMessageForConnection(const int &fd,const uint64_t connection,const std::string &msg,const std::string &type);
4249 bool closeWithoutLock(const int &fd,const std::string &closeCodeAndMessage);
4250 bool closeWithoutLock(const int &fd,const short &code=1000,const std::string &message="bye");
4251 public:
4281 WebSocketServer(const unsigned long long &maxFD=1000000,const int &buffer_size=256,const size_t &finishQueue_cap=65536,const bool &security_open=true,
4282 const int &connectionNumLimit=5,const int &connectionSecs=10,const int &connectionTimes=3,const int &requestSecs=1,const int &requestTimes=10,
4283 const int &checkFrequency=60,const int &connectionTimeout=120):TcpServer(
4284 maxFD,
4286 finishQueue_cap,
4288 connectionNumLimit,
4294 connectionTimeout
4295 ){serverType=3;}
4296
4304 void setSecuritySendBackFun(std::function<void(WebSocketServerFDHandler &k,WebSocketFDInformation &inf)> fc){this->securitySendBackFun=fc;}
4313 void setGlobalSolveFunction(std::function<bool(WebSocketServerFDHandler &k,WebSocketFDInformation &inf)> fc){this->globalSolveFun=fc;}
4322 void setStartFunction(std::function<bool(WebSocketServerFDHandler &k,WebSocketFDInformation &inf)> fccc){this->fccc=fccc;}
4332 void setJudgeFunction(std::function<bool(WebSocketFDInformation &k)> fcc){this->fcc=fcc;}
4349 void setFunction(const std::string &key,std::function<int(WebSocketServerFDHandler &k,WebSocketFDInformation &inf)> fc)
4350 {
4351 auto [it, inserted] = solveFun.try_emplace(key);
4352 it->second.push_back(std::move(fc));
4353 }
4354
4369 void setGetKeyFunction(std::function<int(WebSocketServerFDHandler &k,WebSocketFDInformation &inf)> parseKeyFun){this->parseKey=parseKeyFun;}
4370 //void setFunction(std::function<bool(const std::string &msg,WebSocketServer &k,const WebSocketFDInformation &inf)> fc){this->fc=fc;}
4375 void setTimeOutTime(const int &seca){this->seca=seca*60;}
4381 void setHBTimeOutTime(const int &secb){this->secb=secb;}
4393 bool closeFD(const int &fd,const std::string &closeCodeAndMessage);
4413 bool closeFD(const int &fd,const short &code=1000,const std::string &message="bye");
4437 bool sendMessage(const int &fd,const std::string &msg,const std::string &type="0001");
4442 bool close() override;
4447 bool close(const int &fd) override;
4454 bool startListen(const int &port,const int &threads=8)
4455 {
4456 //std::thread(&WebSocketServer::HB,this).detach();
4457
4458 return TcpServer::startListen(port,threads);
4459 }
4460
4482 void sendMessage(const std::string &msg,const std::string &type="0001");
4488 };
4489
4495 {
4496 protected:
4497 int fd=-1;
4498 bool flag1=false;
4499 bool flag2=false;
4500 int sec=-1;
4501 public:
4509 void setFD(const int &fd,const bool &flag1=false,const int &sec=-1,const bool &flag2=false);
4514 void blockSet(const int &sec=-1);
4527 int getFD(){return fd;}
4532 void close(const bool &cle=true);
4553 int sendData(const std::string &data,const std::string &ip,const int &port,const bool &block=true);
4575 int sendData(const char *data,const uint64_t &length,const std::string &ip,const int &port,const bool &block=true);
4590 int recvData(std::string &data,const uint64_t &length,std::string &ip,int &port);
4605 int recvData(char *data,const uint64_t &length,std::string &ip,int &port);
4606
4607 };
4608
4612 {
4613 public:
4619 UdpClient(const bool &flag1=false,const int &sec=-1);
4625 bool createFD(const bool &flag1=false,const int &sec=-1);
4630 };
4631
4635 {
4636 public:
4644 UdpServer(const int &port,const bool &flag1=false,const int &sec=-1,const bool &flag2=true);
4652 bool createFD(const int &port,const bool &flag1=false,const int &sec=-1,const bool &flag2=true);
4657 };
4658 }
4664 namespace system
4665 {
4674 {
4675 public:
4683 static std::string language;
4684 private:
4685 [[noreturn]] static void signalterminated() noexcept;
4686 public:
4710 static void setLogFile(file::LogFile *logfile=nullptr,const std::string &language="");
4716 static void init(file::LogFile *logfile=nullptr,const std::string &language="");
4717 };
4718
4727 class csemp
4728 {
4729 private:
4735 union semun
4736 {
4737 int val;
4738 struct semid_ds *buf;
4739 unsigned short *arry;
4740 };
4741
4742 int m_semid;
4743 short m_sem_flg;
4744
4745 csemp(const csemp &) = delete;
4746 csemp &operator=(const csemp &) = delete;
4747
4748 public:
4752 csemp():m_semid(-1){}
4753
4764 bool init(key_t key, unsigned short value = 1, short sem_flg = SEM_UNDO);
4765
4774 bool wait(short value = -1);
4775
4784 bool post(short value = 1);
4785
4792
4800 bool destroy();
4801
4806 };
4807
4811 #define MAX_PROCESS_NAME 100
4815 #define MAX_PROCESS_INF 1000
4819 #define SHARED_MEMORY_KEY 0x5095
4823 #define SHARED_MEMORY_LOCK_KEY 0x5095
4824
4829 {
4833 pid_t pid;
4837 time_t lastTime;
4845 char argv0[20];
4849 char argv1[20];
4853 char argv2[20];
4854 };
4855
4864 {
4865 private:
4866
4867 static ProcessInf *p;
4868 static csemp plock;
4869 static bool isJoin;
4870 public:
4879 bool join(const char *name,const char *argv0="",const char *argv1="",const char *argv2="");
4884 bool renew();
4888 static void list();
4895 static bool HBCheck(const int &sec);
4906 };
4907
4912 {
4913 private:
4914 static void prepareForkedChild(const bool terminateWithParent=false) noexcept
4915 {
4916 sigset_t emptySet;
4917 sigemptyset(&emptySet);
4918 pthread_sigmask(SIG_SETMASK,&emptySet,nullptr);
4919 struct sigaction defaultAction{};
4920 sigemptyset(&defaultAction.sa_mask);
4921 defaultAction.sa_handler=SIG_DFL;
4922 for(const int childSignal:{SIGTERM,SIGINT,SIGHUP,SIGQUIT,SIGCHLD,SIGPIPE})
4923 sigaction(childSignal,&defaultAction,nullptr);
4924#ifdef __linux__
4925 if(terminateWithParent)
4926 {
4927 prctl(PR_SET_PDEATHSIG,SIGTERM);
4928 if(getppid()==1)
4929 _exit(128+SIGTERM);
4930 }
4931#else
4932 (void)terminateWithParent;
4933#endif
4934 }
4935 public:
4936
4937
4958 template<class... Args>
4959 static bool startProcess(const std::string &name,const int &sec=-1,Args ...args)
4960 {
4961 std::vector<const char *> paramList={args...,nullptr};
4962 if(sec==-1)
4963 {
4964 pid_t pid=fork();
4965 if(pid==-1)
4966 return false;
4967 if(pid>0)
4968 return true;
4969 else
4970 {
4971 prepareForkedChild();
4972 execv(name.c_str(),const_cast<char* const*>(paramList.data()));
4973 _exit(127);
4974 }
4975 }
4976 pid_t pid=fork();
4977 if(pid==-1)
4978 return false;
4979 if(pid>0)
4980 {
4981 return true;
4982 }
4983 else
4984 {
4985 prepareForkedChild(true);
4986 while(1)
4987 {
4988 pid=fork();
4989 if(pid==0)
4990 {
4991 prepareForkedChild(true);
4992 execv(name.c_str(),const_cast<char* const*>(paramList.data()));
4993 _exit(127);
4994 }
4995 else if(pid>0)
4996 {
4997 int sts;
4998 while(waitpid(pid,&sts,0)<0&&errno==EINTR) {}
4999 sleep(sec);
5000 }
5001 else
5002 continue;
5003 }
5004 }
5005 }
5006
5027 template<class Fn,class... Args>
5028 static typename std::enable_if<!std::is_convertible<Fn, std::string>::value, bool>::type
5029 startProcess(Fn&& fn,const int &sec=-1,Args &&...args)
5030 {
5031 if(sec==-1)
5032 {
5033 pid_t pid=fork();
5034 if(pid==-1)
5035 return false;
5036 if(pid>0)
5037 return true;
5038 else
5039 {
5040 prepareForkedChild();
5041 auto f=std::bind(std::forward<Fn>(fn),std::forward<Args>(args)...);
5042 f();
5043 _exit(EXIT_SUCCESS);
5044 }
5045 }
5046 pid_t pid=fork();
5047 if(pid==-1)
5048 return false;
5049 if(pid>0)
5050 {
5051 return true;
5052 }
5053 else
5054 {
5055 prepareForkedChild(true);
5056 while(1)
5057 {
5058 pid=fork();
5059 if(pid==0)
5060 {
5061 prepareForkedChild(true);
5062 auto f=std::bind(std::forward<Fn>(fn),std::forward<Args>(args)...);
5063 f();
5064 _exit(EXIT_SUCCESS);
5065 }
5066 else if(pid>0)
5067 {
5068 int sts;
5069 while(waitpid(pid,&sts,0)<0&&errno==EINTR) {}
5070 sleep(sec);
5071 }
5072 else
5073 continue;
5074 }
5075 }
5076 }
5077 };
5078
5079 using Task = std::function<void()>;
5106 {
5107 public:
5116 explicit WorkerPool(size_t n,size_t maxPendingTasks=65536):
5117 stop_(false),maxPendingTasks_(std::max<size_t>(1,maxPendingTasks))
5118 {
5119 if(n==0)
5120 throw std::invalid_argument("WorkerPool requires at least one worker");
5121 for (size_t i = 0; i < n; ++i) {
5122 threads_.emplace_back([this] {
5123 this->workerLoop();
5124 });
5125 }
5126 }
5127
5134 {
5135 stop();
5136 }
5137
5144 bool submit(Task task)
5145 {
5146 size_t pending=0;
5147 {
5148 std::lock_guard<std::mutex> lk(mtx_);
5149 if (stop_||tasks_.size()>=maxPendingTasks_)
5150 return false;
5151 tasks_.push(std::move(task));
5152 pending=tasks_.size();
5153 pendingTaskCount_.store(pending,std::memory_order_relaxed);
5154 }
5155 size_t peak=peakPendingTaskCount_.load(std::memory_order_relaxed);
5156 while(peak<pending&&!peakPendingTaskCount_.compare_exchange_weak(
5157 peak,pending,std::memory_order_relaxed,std::memory_order_relaxed)) {}
5158 cv_.notify_one();
5159 return true;
5160 }
5161
5172 void stop(const bool drain=true)
5173 {
5174 std::call_once(stopOnce_,[this,drain] {
5175 {
5176 std::lock_guard<std::mutex> lk(mtx_);
5177 stop_ = true;
5178 if(!drain)
5179 {
5180 tasks_=std::queue<Task>();
5181 pendingTaskCount_.store(0,std::memory_order_relaxed);
5182 }
5183 }
5184 cv_.notify_all();
5185 for (auto &t : threads_)
5186 {
5187 if (t.joinable()) t.join();
5188 }
5189 });
5190 }
5191
5193 size_t pendingTasks() const
5194 {
5195 return pendingTaskCount_.load(std::memory_order_relaxed);
5196 }
5197
5199 size_t maxPendingTasks() const noexcept {return maxPendingTasks_;}
5200
5202 size_t peakPendingTasks() const noexcept
5203 {
5204 return peakPendingTaskCount_.load(std::memory_order_relaxed);
5205 }
5206
5207 private:
5218 void workerLoop()
5219 {
5220 while (true)
5221 {
5222 Task task;
5223 {
5224 std::unique_lock<std::mutex> lk(mtx_);
5225 cv_.wait(lk, [this] {
5226 return stop_ || !tasks_.empty();
5227 });
5228 if (stop_ && tasks_.empty())
5229 {
5230 return;
5231 }
5232 task = std::move(tasks_.front());
5233 tasks_.pop();
5234 pendingTaskCount_.store(tasks_.size(),std::memory_order_relaxed);
5235 }
5236 try
5237 {
5238 task(); // 执行任务
5239 }
5240 catch (...)
5241 {
5242 // 单个任务的异常不应终止整个服务进程或工作线程。
5243 }
5244 }
5245 }
5246
5247 private:
5248 std::vector<std::thread> threads_;
5249 std::queue<Task> tasks_;
5250 mutable std::mutex mtx_;
5251 std::condition_variable cv_;
5252 bool stop_;
5253 const size_t maxPendingTasks_;
5254 std::atomic<size_t> pendingTaskCount_{0};
5255 std::atomic<size_t> peakPendingTaskCount_{0};
5256 std::once_flag stopOnce_;
5257 };
5258 }
5259
5260}
5261
5262
5263#endif
5264
负责二进制数据,字符串之间的转化
Definition sttnet.h:1455
static unsigned long & bitToNumber(const std::string &input, unsigned long &result)
将字符串转换为二进制,再转换为对应数值。
static unsigned long & bitStrToNumber(const std::string &input, unsigned long &result)
将 "01" 字符串(二进制字符串)转换为无符号整数。
static std::string & toBit(const std::string &input, std::string &result)
将任意长度的 "01" 字符串压缩为二进制数据,每 8 位为一个字节。
static char & bitOutput_bit(char input, const int pos, char &result)
获取字符 input 的从左向右第 pos 位(二进制)并返回 '1' 或 '0'。
static std::string & bitOutput(char input, std::string &result)
将单个字符转换为其对应的 8 位二进制字符串。
static std::string & bitOutput(const std::string &input, std::string &result)
将字符串中的每个字符依次转换为二进制位,并拼接为一个整体字符串。
static char & toBit(const std::string &input, char &result)
将最多 8 位的 "01" 字符串压缩成 1 个字节(char)。
负责加密,解密和哈希
Definition sttnet.h:1400
static std::string & sha11(const std::string &ori_str, std::string &result)
计算输入字符串的 SHA-1 哈希值,并以十六进制字符串形式返回。
static bool encryptSymmetric(const unsigned char *before, const size_t &length, const unsigned char *passwd, const unsigned char *iv, unsigned char *after)
AES-256-CBC模式对称加密函数
static bool decryptSymmetric(const unsigned char *before, const size_t &length, const unsigned char *passwd, const unsigned char *iv, unsigned char *after)
AES-256-CBC模式对称解密函数
static std::string & sha1(const std::string &ori_str, std::string &result)
计算输入字符串的 SHA-1 哈希值(原始二进制形式)。
数据编码解码,掩码处理等
Definition sttnet.h:1920
static std::string & generateMask_4(std::string &mask)
生成一个 32 位(4 字节)的随机掩码。
static std::string & transfer_websocket_key(std::string &str)
生成 WebSocket 握手响应中的 Sec-WebSocket-Accept 字段值。
static std::string base64_encode(const std::string &input)
对字符串进行 Base64 编码。
static std::string base64_decode(const std::string &input)
对 Base64 编码的字符串进行解码。
static std::string & maskCalculate(std::string &data, const std::string &mask)
使用给定的 4 字节掩码对字符串进行异或操作(XOR Masking)。
负责Http字符串和URL解析 包括从 URL 或请求报文中提取参数、IP、端口、请求头字段等功能。
Definition sttnet.h:1632
static std::string & get_value_str(const std::string &ori_str, std::string &str, const std::string &name)
从 URL 查询参数中提取指定 key 的值。
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)
从原始字符串中提取两个标记之间的子串。
static std::string & getPara(const std::string &url, std::string &para)
获取 URL 中的查询参数字符串(包括 ?)。
static int & getPort(const std::string &url, int &port)
从 URL 中提取端口号。
static std::string_view & getPara(const std::string_view &url, std::string_view &para)
获取 URL 中的查询参数字符串(包括 ?)。
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)
从原始字符串中提取两个标记之间的子串。
static std::string & get_location_str(const std::string &ori_str, std::string &str)
提取 URL 中 path 和 query 部分。
static std::string_view & get_location_str(const std::string_view &ori_str, std::string_view &str)
提取 URL 中 path 和 query 部分。
static std::string & getIP(const std::string &url, std::string &IP)
从 URL 中提取主机 IP 或域名。
static std::string_view & get_value_str(const std::string_view &ori_str, std::string_view &str, const std::string &name)
从 URL 查询参数中提取指定 key 的值。
static std::string_view & getLocPara(const std::string_view &url, std::string_view &locPara)
提取 URL 的 path 部分(不含 query)。
static std::string createHeader(const std::string &first, const std::string &second)
创建一个 HTTP 请求头字段字符串。
static std::string & getLocPara(const std::string &url, std::string &locPara)
提取 URL 的 path 部分(不含 query)。
static std::string_view & get_value_header(const std::string_view &ori_str, std::string_view &str, const std::string &name)
从 HTTP 请求头中提取指定字段的值。
static std::string & get_value_header(const std::string &ori_str, std::string &str, const std::string &name)
从 HTTP 请求头中提取指定字段的值。
json数据操作类
Definition sttnet.h:1982
static Json::Value toJsonArray(const std::string &str)
解析 JSON 字符串为 Json::Value。
static std::string createArray(T first)
创建只包含一个元素的 JSON 数组字符串。
Definition sttnet.h:2070
static std::string & jsonFormatify(const std::string &a, std::string &b)
将格式化后的 JSON 字符串去除缩进、空格等变成紧凑格式。
static std::string jsonAdd(const std::string &a, const std::string &b)
将两个 JSON 字符串拼接为一个有效的 JSON(适用于对象或数组拼接)。
static std::string toString(const Json::Value &val)
将 Json::Value 序列化为紧凑 JSON 文本。
static std::string & jsonToUTF8(const std::string &input, std::string &output)
将 JSON 字符串中的 Unicode 转义序列转换为 UTF-8 字符。
static int getValue(const std::string &oriStr, std::string &result, const std::string &type="value", const std::string &name="a", const int &num=0)
提取 JSON 字符串中指定字段的值或嵌套结构。
static std::string createArray(T first, Args... args)
创建多个元素组成的 JSON 数组字符串(递归变参模板)。
Definition sttnet.h:2088
static std::string createJson(T1 first, T2 second, Args... args)
创建多个键值对组成的 JSON 字符串(递归变参模板)。
Definition sttnet.h:2045
static std::string createJson(T1 first, T2 second)
创建仅包含一个键值对的 JSON 字符串。
Definition sttnet.h:2020
负责大小端字节序转换
Definition sttnet.h:1557
static unsigned long & htonl_ntohl_64(unsigned long &data)
将 64 位无符号整数的字节序反转(大端 <-> 小端)。
负责字符串和数字的转化
Definition sttnet.h:1850
static std::string & strto16(const std::string &ori_str, std::string &result)
将普通字符串转化为对应的十六进制表示字符串(hex string)。
static int & toInt(const std::string_view &ori_str, int &result, const int &i=-1)
string转化为int类型
static bool & toBool(const std::string_view &ori_str, bool &result)
string转化为bool类型
static float & toFloat(const std::string &ori_str, float &result, const float &i=-1)
string转化为float类型
static int & str16toInt(const std::string_view &ori_str, int &result, const int &i=-1)
16进制数字的字符串表示转化为10进制int类型数字
static double & toDouble(const std::string &ori_str, double &result, const double &i=-1)
string转化为double类型
static long & toLong(const std::string_view &ori_str, long &result, const long &i=-1)
string转化为long类型
负责浮点数精度处理
Definition sttnet.h:1577
static double & getPreciesDouble(double &number, const int &bit)
将 double 数值保留指定位数的小数,并直接修改原值。
static float & getValidFloat(float &number, const int &bit)
根据数值动态调整小数精度,保留指定数量的有效数字。
static std::string & getPreciesFloat(const float &number, const int &bit, std::string &str)
将浮点数格式化为指定小数位数的字符串表示。
static std::string & getPreciesDouble(const double &number, const int &bit, std::string &str)
将双精度浮点数格式化为指定小数位数的字符串表示。
static float & getPreciesFloat(float &number, const int &bit)
将 float 数值保留指定位数的小数,并直接修改原值。
随机数,字符串生成相关
Definition sttnet.h:1521
static std::string & getRandomStr_base64(std::string &str, const int &length)
生成一个规定长度的“Base64 字符集内的伪随机字符串”,并在末尾用 '=' 补齐至符合 Base64 字符串格式
static std::string & generateMask_4(std::string &mask)
生成一个 32 位(4 字节)的随机掩码。
static long getRandomNumber(const long &a, const long &b)
生成一个随机整数
负责websocket协议有关字符串的操作
Definition sttnet.h:1831
static std::string & transfer_websocket_key(std::string &str)
生成 WebSocket 握手响应中的 Sec-WebSocket-Accept 字段值。
提供文件操作的静态函数工具类
Definition sttnet.h:393
static bool createDir(const std::string &ddir, const mode_t &mode=0775)
新建一个目录
static bool createFile(const std::string &filePath, const mode_t &mode=0666)
新建一个文件
static bool copy(const std::string &sourceFile, const std::string &objectFile)
复制文件
static size_t get_file_size(const std::string &fileName)
获取文件大小
读写磁盘文件的类
Definition sttnet.h:463
bool openFile(const std::string &fileName, const bool &create=true, const int &multiple=0, const size_t &size=0, const mode_t &mode=0666)
打开文件
void format()
格式化数据
bool write(const char *data, const size_t &pos, const size_t &size)
写数据块
bool lockMemory()
把数据从磁盘读入内存
bool closeFile(const bool &del=false)
关闭已打开了的文件
bool deleteAll()
删除全部
bool deleteLineC(const int &linePos=0)
删除行
bool readLineC(std::string &data, const int linePos)
读取单行
std::string getFileName()
获取打开的文件名字
Definition sttnet.h:572
bool unlockMemory(const bool &rec=false)
把数据从内存写入磁盘
size_t getSize1()
获取二进制打开的文件在内存中的大小
Definition sttnet.h:599
std::string & readAllC(std::string &data)
读取全部
bool chgLineC(const std::string &data, const int &linePos=0)
修改行
bool deleteLine(const int &linePos=0)
删除行
bool isOpen()
判断对象是否打开了文件
Definition sttnet.h:562
bool writeC(const char *data, const size_t &pos, const size_t &size)
写数据块
int find(const std::string &targetString, const int linePos=1)
查找行
~File()
析构函数
Definition sttnet.h:557
uint64_t getFileLine()
获取打开的文件的行数
Definition sttnet.h:581
std::string & read(std::string &data, const int &linePos, const int &num)
读取行
bool formatC()
格式化数据
std::mutex che
Definition sttnet.h:468
bool appendLineC(const std::string &data, const int &linePos=0)
插入行
std::string & readC(std::string &data, const int &linePos, const int &num)
读取行
static std::mutex l1
Definition sttnet.h:465
int findC(const std::string &targetString, const int linePos=1)
查找行
std::string & readAll(std::string &data)
读取全部
size_t getFileSize()
获取二进制打开的文件的大小
Definition sttnet.h:590
bool readLine(std::string &data, const int linePos)
读取单行
bool read(char *data, const size_t &pos, const size_t &size)
读取数据块
bool deleteAllC()
删除全部
bool chgLine(const std::string &data, const int &linePos=0)
修改行
bool isBinary()
判断对象是否以二进制模式打开文件
Definition sttnet.h:567
static std::unordered_map< std::string, FileThreadLock > fl2
Definition sttnet.h:466
bool appendLine(const std::string &data, const int &linePos=0)
插入行
bool readC(char *data, const size_t &pos, const size_t &size)
读取数据块
日志文件操作类
Definition sttnet.h:1269
bool openFile(const std::string &fileName, const std::string &timeFormat=ISO8086A, const std::string &contentFormat=" ")
打开一个日志文件
~LogFile()
析构函数 写完日志 关闭消费者线程
bool closeFile(const bool &del=false)
关闭对象打开的日志文件
bool deleteLogByTime(const std::string &date1="1", const std::string &date2="2")
删除指定时间区间内的日志
void writeLog(const std::string &data)
写一行日志
bool isOpen()
获取对象是否打开日志文件的状态
Definition sttnet.h:1348
LogFile(const size_t &logQueue_cap=8192)
Definition sttnet.h:1301
std::string getFileName()
获取对象打开的文件名
Definition sttnet.h:1353
bool clearLog()
清空所有日志
uint64_t getDroppedLogCount() const noexcept
返回日志队列满时累计丢弃的日志条数。
Definition sttnet.h:1369
用独立、可 join 的 Reactor 线程监听单个 Linux 文件描述符。
Definition sttnet.h:2928
void setFunction(std::function< bool(const int &fd)> fc)
设置epoll触发后的处理函数 注册一个回调函数
Definition sttnet.h:2974
void waitAndQuit(const time::Duration &t=time::Duration{0, 0, 0, 10, 10})
开始退出epoll倒计时,直到套接字有新的消息 如果套接字倒计时结束还没有新的消息,那么退出epoll
Definition sttnet.h:3010
void endListenWithSignal()
发送结束epoll的信号
void setEndFunction(std::function< void(const int &fd)> fcEnd)
设置epoll退出前的回调函数 注册一个回调函数
Definition sttnet.h:2982
void startListen(const int &fd, const bool &flag=true, const time::Duration &dt=time::Duration{0, 0, 20, 0, 0})
开始监听
bool isListen()
返回epoll监听状态
Definition sttnet.h:2964
bool endListen()
结束epoll监听 会阻塞直到epoll退出完成
~EpollSingle()
EpollSingle的析构函数 调用 endListen() 唤醒并 join 监听线程。
Definition sttnet.h:3020
void setTimeOutFunction(std::function< bool(const int &fd)> fcTimeOut)
设置epoll超时后出发的回调函数 注册一个回调函数
Definition sttnet.h:2992
bool getRequest(const std::string &url, const std::string &header="", const std::string &header1="Connection: keep-alive", const int &sec=-1)
发送一个GET请求到服务器
HttpClient(const bool &TLS=false, const char *ca="", const char *cert="", const char *key="", const char *passwd="")
HttpClient类的构造函数
Definition sttnet.h:2847
std::string body
服务器返回响应体
Definition sttnet.h:2920
std::string header
服务器返回响应头
Definition sttnet.h:2916
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)
发送一个POST请求到服务器
bool isReturn()
获取服务器返回响应状态
Definition sttnet.h:2912
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)
从tcp套接字发送一个GET请求到服务器
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)
发送一个POST请求到服务器
解析,响应Http/https请求的操作类 仅传入套接字,然后使用这个类进行Http的操作
Definition sttnet.h:3222
bool sendBack(const std::string &data, const std::string &header="", const std::string &code="200 OK", const std::string &header1="")
发送Http/Https响应
int solveRequest(TcpFDInf &TcpInf, HttpRequestInformation &HttpInf, const unsigned long &buffer_size, const int &times=1, const unsigned long &max_header_size=64UL *1024UL)
解析Http/Https请求
bool redirect(const std::string &location, const std::string &code="302 Found")
发送 HTTP 重定向响应。
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)
发送Http/Https响应
void setFD(const int &fd, SSL *ssl=nullptr, const bool &flag1=false, const bool &flag2=true)
初始化对象,传入套接字等参数
Definition sttnet.h:3231
bool sendJson(const Json::Value &data, const std::string &code="200 OK", const std::string &extraHeaders="")
序列化 Json::Value 并发送 application/json UTF-8 响应。
bool sendText(const std::string &data, const std::string &code="200 OK", const std::string &contentType="text/plain; charset=utf-8", const std::string &extraHeaders="")
发送文本响应,自动补充 Content-Type 和 Content-Length。
void setGlobalSolveFunction(std::function< int(HttpServerFDHandler &k, HttpRequestInformation &inf)> fc)
设置全局备用函数
Definition sttnet.h:4090
void setSecuritySendBackFun(std::function< void(HttpServerFDHandler &k, HttpRequestInformation &inf)> fc)
设置违反信息安全策略时候的返回函数
Definition sttnet.h:4081
bool startListen(const int &port, const int &threads=8)
打开Http服务器监听程序
Definition sttnet.h:4144
void setFunction(const std::string &key, std::function< int(HttpServerFDHandler &k, HttpRequestInformation &inf)> fc)
设置key对应的收到客户端消息后的回调函数
Definition sttnet.h:4117
void putTask(const std::function< int(HttpServerFDHandler &k, HttpRequestInformation &inf)> &fun, HttpServerFDHandler &k, HttpRequestInformation &inf)
把一个任务放入工作线程池由工作线程完成
void setGetKeyFunction(std::function< int(HttpServerFDHandler &k, HttpRequestInformation &inf)> parseKeyFun)
设置解析出key的回调函数
Definition sttnet.h:4137
bool close(const int &fd) override
关闭某个套接字的连接
~HttpServer()
析构函数
Definition sttnet.h:4153
bool close() override
关闭监听和所有已连接的套接字
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:4058
bool close()
如果对象有套接字连接,关闭和释放这个连接和套接字,并且重新新建一个套接字。
int getServerPort()
返回已连接的客户端的端口 return 已连接的服务端的端口
Definition sttnet.h:2815
bool isConnect()
返回对象的连接状态
Definition sttnet.h:2820
std::string getServerIP()
返回已连接的服务端的ip return 已连接的服务端的ip
Definition sttnet.h:2810
bool connect(const std::string &ip, const int &port)
向服务端发起tcp连接
void resetCTX(const bool &TLS=false, const char *ca="", const char *cert="", const char *key="", const char *passwd="")
重新或第一次设置TLS加密参数
~TcpClient()
TcpClient的析构函数,会关闭释放套接字和其连接
Definition sttnet.h:2804
TcpClient(const bool &TLS=false, const char *ca="", const char *cert="", const char *key="", const char *passwd="")
TcpClient类的构造函数
tcp协议的套接字操作类
Definition sttnet.h:2565
bool flag1
Definition sttnet.h:2568
int fd
Definition sttnet.h:2567
int recvData(char *data, const uint64_t &length)
从已连接的套接字中接收一次数据到char*容器
int recvDataByLength(char *data, const uint64_t &length, const int &sec=2)
从已连接的套接字中阻塞接收指定长度的数据到char*容器
int getFD()
获取该对象的套接字
Definition sttnet.h:2606
SSL * ssl
Definition sttnet.h:2570
std::function< void()> queuedCloseFunction
Definition sttnet.h:2573
int recvDataByLength(std::string &data, const uint64_t &length, const int &sec=2)
从已连接的套接字中阻塞接收指定长度的数据到字符串
bool flag2
Definition sttnet.h:2569
SSL * getSSL()
获取该对象的加密SSL句柄
Definition sttnet.h:2611
void blockSet(const int &sec=-1)
设置对象中的套接字为阻塞模式
int sendData(const char *data, const uint64_t &length, const bool &block=true)
向已连接的套接字发送指定长度的二进制数据。
void close(const bool &cle=true)
关闭对象
int sec
Definition sttnet.h:2571
bool isConnect()
判断对象是否有套接字绑定
Definition sttnet.h:2634
bool multiUseSet()
设置对象中的套接字为SO_REUSEADDR模式
void unblockSet()
设置对象中的套接字为非阻塞模式
std::function< int(std::string)> queuedSendFunction
Definition sttnet.h:2572
int recvData(std::string &data, const uint64_t &length)
从已连接的套接字中接收一次数据到string字符串容器
bool flag3
如果sendData的block=true,如果发送过程中连接断开,这个标志位会置为true
Definition sttnet.h:2578
void setFD(const int &fd, SSL *ssl, const bool &flag1=false, const bool &flag2=false, const int &sec=-1)
传入套接字初始化对象
void setTransportFunctions(std::function< int(std::string)> sendFunction, std::function< void()> closeFunction={})
由服务端 Reactor 注入异步发送和关闭通道。
Definition sttnet.h:2597
int sendData(const std::string &data, const bool &block=true)
向已连接的套接字发送字符串数据。
uint64_t connection_obj_fd
Definition sttnet.h:3619
std::atomic< uint64_t > metricSendReadyQueueOverflows
Definition sttnet.h:3642
virtual ~TcpServer()
TcpServer 类的析构函数
Definition sttnet.h:3997
ServerMetricsSnapshot getMetrics() const noexcept
获取服务器运行指标快照。
Definition sttnet.h:3946
std::atomic< bool > workerWakePending
Definition sttnet.h:3595
std::atomic< bool > gracefulDrainRequested
Definition sttnet.h:3602
std::atomic< uint64_t > metricActiveConnections
Definition sttnet.h:3629
void setPathStrategy(const stt::security::RateLimitType &type)
设置“path 级请求限流”所使用的策略。
Definition sttnet.h:3863
std::unordered_map< int, std::weak_ptr< ConnectionWriteState > > writeRegistry
Definition sttnet.h:3610
std::atomic< uint64_t > metricIdleTimeoutChecks
Definition sttnet.h:3649
int getListenPort() const noexcept
获取当前实际监听端口。
Definition sttnet.h:3985
std::atomic< uint64_t > metricClosedConnections
Definition sttnet.h:3630
int enqueueWrite(const std::shared_ptr< ConnectionWriteState > &state, std::string data)
stt::system::WorkerPool * workpool
Definition sttnet.h:3571
bool TLS
Definition sttnet.h:3587
std::condition_variable gracefulShutdownCV
Definition sttnet.h:3604
bool unblock
Definition sttnet.h:3585
std::atomic< uint64_t > metricReactorWakeups
Definition sttnet.h:3644
WriteFlushResult flushConnectionWrites(TcpFDInf &connection)
size_t writeBudgetPerEvent
Definition sttnet.h:3621
std::atomic< uint64_t > metricReactorWakeupsCoalesced
Definition sttnet.h:3645
void prepareHandler(TcpFDHandler &handler, const int &fd)
void redrawTLS()
撤销TLS加密,ca证书等
void reportReactorStartup(const bool success)
std::unordered_map< int, TcpFDInf > clientfd
Definition sttnet.h:3577
virtual bool close(const int &fd)
关闭某个套接字的连接
std::atomic< uint64_t > metricBatchedWriteSyscalls
Definition sttnet.h:3647
void applyAcceptedSocketOptions(const int &acceptedFD) const noexcept
void setMaxPendingWriteBytes(const size_t bytes)
设置每连接待发送数据高水位。
Definition sttnet.h:3887
void putTask(const std::function< int(TcpFDHandler &k, TcpInformation &inf)> &fun, TcpFDHandler &k, TcpInformation &inf)
把一个任务放入工作线程池由工作线程完成
std::condition_variable reactorStartupCV
Definition sttnet.h:3599
WriteFlushResult
Definition sttnet.h:3676
@ WaitWrite
Definition sttnet.h:3676
@ Reschedule
Definition sttnet.h:3676
@ WaitRead
Definition sttnet.h:3676
bool updateConnectionEvents(const int &epollFD, TcpFDInf &connection, const bool &wantWrite)
std::deque< SendReadyMessage > timeoutCandidates
Definition sttnet.h:3612
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:3729
size_t sendReadyBudgetPerWake
Definition sttnet.h:3625
int connectionTimes
Definition sttnet.h:3615
std::mutex writeRegistryMutex
Definition sttnet.h:3609
size_t gracefulShutdownTimeoutMs
Definition sttnet.h:3626
std::atomic< uint64_t > metricWorkerTaskRejections
Definition sttnet.h:3643
void setMaxHttpHeaderBytes(const size_t bytes)
设置 HTTP 请求和 WebSocket 握手头上限。
Definition sttnet.h:3899
bool setTLS(const char *cert, const char *key, const char *passwd, const char *ca)
以兼容模式启用双向 TLS(mTLS)。
std::atomic< uint64_t > metricWorkerQueueOverflows
Definition sttnet.h:3641
int connectionSecs
Definition sttnet.h:3614
void notifyReactor() noexcept
std::atomic< uint64_t > metricQueuedWriteBytes
Definition sttnet.h:3635
std::mutex tlsContextMutex
Definition sttnet.h:3588
void setRequestStrategy(const stt::security::RateLimitType &type)
设置“IP 级请求限流”所使用的策略。
Definition sttnet.h:3855
std::atomic< uint64_t > metricBatchedWriteBuffers
Definition sttnet.h:3648
unsigned long long maxFD
Definition sttnet.h:3573
ServerSocketOptions socketOptions
Definition sttnet.h:3627
bool setTLS(const char *cert, const char *key, const char *passwd="")
启用普通单向 TLS,适用于常见 HTTPS/WSS 服务。
std::atomic< uint64_t > metricIdleTimeoutCloses
Definition sttnet.h:3650
std::atomic< uint64_t > metricSentBytes
Definition sttnet.h:3636
bool stopListen()
停止监听
std::atomic< uint64_t > metricRejectedConnections
Definition sttnet.h:3631
std::deque< SendReadyMessage > overflowSendReadyQueue
Definition sttnet.h:3608
system::MPSCQueue< WorkerMessage > finishQueue
Definition sttnet.h:3569
void setConnectStrategy(const stt::security::RateLimitType &type)
设置“连接速率限流”所使用的策略。
Definition sttnet.h:3848
system::MPSCQueue< SendReadyMessage > sendReadyQueue
Definition sttnet.h:3570
void drainReactorWork(const int &epollFD)
std::atomic< uint64_t > metricWriteOverflows
Definition sttnet.h:3640
std::atomic< bool > flag1
Definition sttnet.h:3578
security::ConnectionLimiter connectionLimiter
Definition sttnet.h:3574
void setGracefulShutdownTimeout(const size_t milliseconds)
设置 close()/stopListen() 等待在途请求和发送队列排空的最长时间。
Definition sttnet.h:3940
std::deque< WorkerMessage > overflowFinishQueue
Definition sttnet.h:3606
unsigned long buffer_size
Definition sttnet.h:3572
int serverType
Definition sttnet.h:3613
std::thread reactorThread
Definition sttnet.h:3597
void scheduleBufferedRead(const int &fd, const uint64_t connection)
void prepareQueuedHandler(TcpFDHandler &handler, const int &fd)
void setReactorMessageBudgets(const size_t workerCompletions, const size_t sendReadyNotifications)
设置单次 Reactor 唤醒处理的跨线程消息预算。
Definition sttnet.h:3912
std::atomic< uint64_t > metricWriteSyscalls
Definition sttnet.h:3646
bool security_open
Definition sttnet.h:3591
std::atomic< uint64_t > metricGracefulShutdownTimeouts
Definition sttnet.h:3651
size_t drainSendReady(const int &epollFD, const size_t budget)
SSL_CTX * ctx
Definition sttnet.h:3586
void setGlobalSolveFunction(std::function< bool(TcpFDHandler &k, TcpInformation &inf)> fc)
设置全局备用函数
Definition sttnet.h:3794
bool reactorStartupSuccess
Definition sttnet.h:3601
void requestCloseAfterFlush(const int &fd, const uint64_t expectedConnection=0)
std::atomic< uint64_t > metricPeakPendingWorkerTasks
Definition sttnet.h:3639
int requestSecs
Definition sttnet.h:3616
bool isListen()
返回对象的监听状态
Definition sttnet.h:3980
void setPathLimit(const std::string &path, const int &times, const int &secs)
设置某个路径的额外限流规则(path 级)。
Definition sttnet.h:3877
void setMaxPendingWorkerTasks(const size_t tasks)
设置 WorkerPool 尚未开始执行的任务上限。
Definition sttnet.h:3905
std::atomic< int > workerEventFD
Definition sttnet.h:3594
bool setTLS(const char *cert, const char *key, const char *passwd, const char *ca, TLSClientAuthMode clientAuth)
启用 TLS 并显式选择客户端证书校验模式。
SSL * getSSL(const int &fd)
查询和服务端的连接,传入套接字,返回加密的SSL句柄
std::atomic< uint64_t > metricAcceptedConnections
Definition sttnet.h:3628
std::mutex reactorStartupMutex
Definition sttnet.h:3598
void publishSendReady(const std::shared_ptr< ConnectionWriteState > &state)
std::mutex gracefulShutdownMutex
Definition sttnet.h:3603
size_t drainWorkerResults(const size_t budget)
void setGetKeyFunction(std::function< int(TcpFDHandler &k, TcpInformation &inf)> parseKeyFun)
设置解析出key的回调函数
Definition sttnet.h:3819
void setSecuritySendBackFun(std::function< void(TcpFDHandler &k, TcpInformation &inf)> fc)
设置违反信息安全策略时候的返回函数
Definition sttnet.h:3785
std::recursive_mutex lifecycleMutex
Definition sttnet.h:3596
bool startListen(const int &port, const int &threads=8)
打开Tcp服务器监听程序
std::atomic< uint64_t > metricTLSHandshakeFailures
Definition sttnet.h:3633
std::mutex overflowFinishMutex
Definition sttnet.h:3605
size_t maxPendingWriteBytes
Definition sttnet.h:3620
size_t maxPendingWorkerTasks
Definition sttnet.h:3623
std::deque< SendReadyMessage > bufferedReadQueue
Definition sttnet.h:3611
size_t maxHttpHeaderBytes
Definition sttnet.h:3622
std::atomic< uint64_t > metricParsedHttpRequests
Definition sttnet.h:3634
std::atomic< uint64_t > metricPendingWriteBytes
Definition sttnet.h:3637
void setSocketOptions(const ServerSocketOptions &options)
设置新接收 TCP 连接的常用套接字参数。
Definition sttnet.h:3922
std::atomic< uint64_t > metricAcceptErrors
Definition sttnet.h:3632
size_t workerCompletionBudgetPerWake
Definition sttnet.h:3624
std::mutex overflowSendReadyMutex
Definition sttnet.h:3607
void setFunction(const std::string &key, std::function< int(TcpFDHandler &k, TcpInformation &inf)> fc)
设置key对应的收到客户端消息后的回调函数
Definition sttnet.h:3805
int requestTimes
Definition sttnet.h:3617
std::atomic< uint64_t > metricPeakPendingWriteBytes
Definition sttnet.h:3638
bool reactorStartupComplete
Definition sttnet.h:3600
void requestQueuedClose(const std::shared_ptr< ConnectionWriteState > &state)
int checkFrequency
Definition sttnet.h:3618
void publishWorkerResult(WorkerMessage message)
virtual bool close()
关闭监听和所有已连接的套接字
void setCloseFun(std::function< void(const int &fd)> closeFun)
设置关闭tcp连接之后调用的函数
Definition sttnet.h:3881
void handleSendReady(const int &epollFD, SendReadyMessage message)
void setWriteBudgetPerEvent(const size_t bytes)
设置 Reactor 单次处理一个连接的最大发送字节数。
Definition sttnet.h:3893
bool createFD(const bool &flag1=false, const int &sec=-1)
销毁原来的套接字,重新创建一个客户端
~UdpClient()
析构函数,对象生命结束会会关闭套接字
Definition sttnet.h:4629
UdpClient(const bool &flag1=false, const int &sec=-1)
构造函数
UDP操作的类 传入套接字进行UDP协议的操作
Definition sttnet.h:4495
int sec
Definition sttnet.h:4500
int recvData(std::string &data, const uint64_t &length, std::string &ip, int &port)
接收一次数据到string字符串容器
int sendData(const char *data, const uint64_t &length, const std::string &ip, const int &port, const bool &block=true)
向目标发送指定长度的二进制数据。
int fd
Definition sttnet.h:4497
bool multiUseSet()
设置SO_REUSEADDR模式
void unblockSet()
设置为非阻塞模式
void close(const bool &cle=true)
置空对象,关闭套接字
int sendData(const std::string &data, const std::string &ip, const int &port, const bool &block=true)
向目标发送字符串数据。
bool flag2
Definition sttnet.h:4499
int getFD()
返回fd
Definition sttnet.h:4527
bool flag1
Definition sttnet.h:4498
void blockSet(const int &sec=-1)
设置为阻塞模式
int recvData(char *data, const uint64_t &length, std::string &ip, int &port)
接收一次数据到char*容器
void setFD(const int &fd, const bool &flag1=false, const int &sec=-1, const bool &flag2=false)
设置fd
bool createFD(const int &port, const bool &flag1=false, const int &sec=-1, const bool &flag2=true)
销毁原来的套接字,重新创建一个服务端
UdpServer(const int &port, const bool &flag1=false, const int &sec=-1, const bool &flag2=true)
构造函数
~UdpServer()
析构函数,对象生命结束会会关闭套接字
Definition sttnet.h:4656
std::string getServerPort()
如果连接到了服务器,以字符串返回服务器端口。
Definition sttnet.h:3143
std::string getServerIp()
如果连接到了服务器 返回服务器ip
Definition sttnet.h:3137
WebSocketClient(const bool &TLS=false, const char *ca="", const char *cert="", const char *key="", const char *passwd="")
WebSocketClient类的构造函数
Definition sttnet.h:3052
int getServerPortNumber()
如果连接到了服务器,以整数返回服务器端口。
Definition sttnet.h:3148
void close(const short &code=1000, const std::string &message="bye", const bool &wait=true)
发送关闭帧并关闭 WebSocket 连接(标准方式)
void setFunction(std::function< bool(const std::string &message, WebSocketClient &k)> fc)
设置收到服务端消息后的回调函数 注册一个回调函数
Definition sttnet.h:3063
void close(const std::string &closeCodeAndMessage, const bool &wait=true)
发送关闭帧并关闭 WebSocket 连接(简化方式)
std::string getUrl()
如果连接到了服务器 返回url
Definition sttnet.h:3132
~WebSocketClient()
WebSocketClient类的析构函数,销毁对象时候会优雅退出断开连接
bool connect(const std::string &url, const int &min=20)
连接到websocket服务器
bool sendMessage(const std::string &message, const std::string &type="0001")
发送 WebSocket 消息
bool isConnect()
返回连接状态
Definition sttnet.h:3127
WebSocket协议的操作类 仅传入套接字,然后使用这个类进行WebSocket的操作
Definition sttnet.h:4163
bool sendMessage(const std::string &msg, const std::string &type="0001")
发送一条websocket信息
int getMessage(TcpFDInf &Tcpinf, WebSocketFDInformation &Websocketinf, const unsigned long &buffer_size, const int &ii=1)
获取一条websocket消息
void setFD(const int &fd, SSL *ssl=nullptr, const bool &flag1=false, const bool &flag2=true)
初始化对象,传入套接字等参数
Definition sttnet.h:4172
void setTimeOutTime(const int &seca)
设置心跳时间
Definition sttnet.h:4375
bool close() override
关闭监听和所有连接
void setGlobalSolveFunction(std::function< bool(WebSocketServerFDHandler &k, WebSocketFDInformation &inf)> fc)
设置全局备用函数
Definition sttnet.h:4313
bool close(const int &fd) override
关闭某个套接字的连接
bool closeFD(const int &fd, const short &code=1000, const std::string &message="bye")
发送关闭帧关闭对应套接字的 WebSocket 连接(标准方式)
void setSecuritySendBackFun(std::function< void(WebSocketServerFDHandler &k, WebSocketFDInformation &inf)> fc)
设置违反信息安全策略时候的返回函数
Definition sttnet.h:4304
void setGetKeyFunction(std::function< int(WebSocketServerFDHandler &k, WebSocketFDInformation &inf)> parseKeyFun)
设置解析出key的回调函数
Definition sttnet.h:4369
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:4281
void putTask(const std::function< int(WebSocketServerFDHandler &k, WebSocketFDInformation &inf)> &fun, WebSocketServerFDHandler &k, WebSocketFDInformation &inf)
把一个任务放入工作线程池由工作线程完成
void setJudgeFunction(std::function< bool(WebSocketFDInformation &k)> fcc)
设置websocket握手阶段的检查函数,只有检查通过才执行后续握手 注册一个回调函数
Definition sttnet.h:4332
void setFunction(const std::string &key, std::function< int(WebSocketServerFDHandler &k, WebSocketFDInformation &inf)> fc)
设置key对应的收到客户端消息后的回调函数
Definition sttnet.h:4349
bool startListen(const int &port, const int &threads=8)
打开Websocket服务器监听程序
Definition sttnet.h:4454
void setStartFunction(std::function< bool(WebSocketServerFDHandler &k, WebSocketFDInformation &inf)> fccc)
设置websocket连接成功后就执行的回调函数 注册一个回调函数
Definition sttnet.h:4322
bool sendMessage(const int &fd, const std::string &msg, const std::string &type="0001")
发送 WebSocket 消息给某一个客户端
void sendMessage(const std::string &msg, const std::string &type="0001")
广播发送 WebSocket 消息
~WebSocketServer()
WebSocketServer的析构函数
Definition sttnet.h:4487
bool closeFD(const int &fd, const std::string &closeCodeAndMessage)
发送关闭帧关闭对应套接字的 WebSocket 连接(简化方式)
void setHBTimeOutTime(const int &secb)
设置发送心跳后的等待时间
Definition sttnet.h:4381
统一的连接与请求安全裁决器(IP 级 + fd 级,多策略限流 + 黑名单)。
Definition sttnet.h:2382
void setRequestStrategy(const RateLimitType &type)
设置“IP 级请求限流”所使用的策略。
DefenseDecision allowRequest(const std::string &ip, const int &fd, const std::string_view &path, const int &times, const int &secs)
对已建立连接的一次请求进行安全裁决。
ConnectionLimiter(const int &maxConn=20, const int &idleTimeout=60)
构造函数。
Definition sttnet.h:2390
bool connectionDetect(const std::string &ip, const int &fd)
检测并清理僵尸连接(fd 级)。
DefenseDecision allowConnect(const std::string &ip, const int &fd, const int &times, const int &secs)
对新建立的连接进行安全裁决(IP 级)。
void setPathStrategy(const RateLimitType &type)
设置“path 级请求限流”所使用的策略。
void clearIP(const std::string &ip, const int &fd)
在连接断开时回收对应 fd 的状态。
void setPathLimit(const std::string &path, const int &times, const int &secs)
设置某个路径的额外限流规则(path 级)。
void banIP(const std::string &ip, int banSeconds, const std::string &reasonCN, const std::string &reasonEN)
立即将指定 IP 加入黑名单(直接封禁)。
bool isBanned(const std::string &ip) const
判断某ip是否被封禁
void setConnectStrategy(const RateLimitType &type)
设置“连接速率限流”所使用的策略。
void unbanIP(const std::string &ip)
手动解除某个 IP 的黑名单。
负责进程心跳监控,调度的类 用于监控服务进程,保证服务进程持续有效运行 进程结束后,0x5095这一块共享内存和信号量都没有删掉 目前只支持最多三个参数的进程加入监控 应该自己手动在程序编写加入心跳监控...
Definition sttnet.h:4864
bool join(const char *name, const char *argv0="", const char *argv1="", const char *argv2="")
把进程加入到心跳系统
~HBSystem()
HBSystem的析构函数
bool renew()
更新当前进程的心跳
bool deleteFromHBS()
把当前进程从心跳系统中删除
static bool HBCheck(const int &sec)
检查心跳监控系统 如果上一次心跳更新的时间和现在的时候相差大于等于sec秒,则杀死进程 先发送信号15杀死进程 如果8秒后进程还存在 则发送信号9强制杀死
static void list()
输出心跳监控系统的所有进程的信息
Lock-free bounded MPSC queue (Multi-Producer Single-Consumer) 无锁有界多生产者单消费者队列(环形缓冲)
Definition sttnet.h:204
MPSCQueue & operator=(const MPSCQueue &)=delete
bool push(const T &v)
Definition sttnet.h:243
MPSCQueue(std::size_t capacity_pow2)
Definition sttnet.h:206
~MPSCQueue()
Definition sttnet.h:230
MPSCQueue(const MPSCQueue &)=delete
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:239
std::size_t approx_size() const noexcept
Approximate size (may be inaccurate under concurrency) 近似长度(并发下可能不精确)
Definition sttnet.h:285
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:254
bool possibly_nonempty() const noexcept
判断队列是否可能包含数据。
Definition sttnet.h:295
进程管理的静态工具类
Definition sttnet.h:4912
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:5029
static bool startProcess(const std::string &name, const int &sec=-1, Args ...args)
启动一个新进程(可选择是否定时重启)
Definition sttnet.h:4959
初始化服务系统的类
Definition sttnet.h:4674
static bool blockTerminationSignals()
在创建任何工作线程前阻塞 SIGTERM 和 SIGINT。
static void setLogFile(file::LogFile *logfile=nullptr, const std::string &language="")
设置日志系统的日志文件对象 传入的日志文件对象如果是没初始化的空的对象,系统自动在程序目录下生成server_log文件夹并且根据当前时间生成一个日志文件记录服务程序的网络通信 如果传入的日志文件对象是...
static void setExceptionHandling()
设置系统的信号
static file::LogFile * logfile
系统的日志系统的读写日志对象的指针
Definition sttnet.h:4679
static int waitForTerminationSignal()
同步等待 SIGTERM/SIGINT,返回收到的信号,失败返回 -1。
static void init(file::LogFile *logfile=nullptr, const std::string &language="")
执行setExceptionHandling和setLogFile两个函数,完成初始化信号和日志系统
static std::string language
系统的日志系统的语言选择,默认为English
Definition sttnet.h:4683
固定大小的工作线程池
Definition sttnet.h:5106
~WorkerPool()
析构函数
Definition sttnet.h:5133
size_t peakPendingTasks() const noexcept
返回等待任务数的历史峰值。
Definition sttnet.h:5202
void stop(const bool drain=true)
停止线程池并等待所有线程退出
Definition sttnet.h:5172
size_t maxPendingTasks() const noexcept
返回等待任务队列容量。
Definition sttnet.h:5199
WorkerPool(size_t n, size_t maxPendingTasks=65536)
构造函数,创建指定数量的工作线程
Definition sttnet.h:5116
bool submit(Task task)
向线程池提交一个任务
Definition sttnet.h:5144
size_t pendingTasks() const
返回当前等待执行的任务数(瞬时快照)。
Definition sttnet.h:5193
封装 System V 信号量的同步工具类。
Definition sttnet.h:4728
bool destroy()
销毁当前信号量。
bool init(key_t key, unsigned short value=1, short sem_flg=SEM_UNDO)
初始化信号量。
bool post(short value=1)
V 操作(释放),尝试将信号量值加上 value。
bool wait(short value=-1)
P 操作(等待),尝试将信号量值减去 value。
csemp()
构造函数,初始化内部状态。
Definition sttnet.h:4752
int getvalue()
获取信号量当前的值。
~csemp()
析构函数,不自动销毁信号量。
时间操作、运算、计时的类
Definition sttnet.h:1170
static Duration & calculateTime(const std::string &time1, const std::string &time2, Duration &result, const std::string &format1=ISO8086A, const std::string &format2=ISO8086A)
计算两个用字符串表示的时间相减的差值
static bool convertFormat(std::string &timeStr, const std::string &oldFormat, const std::string &newFormat=ISO8086A)
转化时间字符串的格式
bool startTiming()
开始计时
static std::string & getTime(std::string &timeStr, const std::string &format=ISO8086A)
获取当前时间
Duration getDt()
获取上一次计时的时间
Definition sttnet.h:1253
bool isStart()
返回本对象计时状态
Definition sttnet.h:1258
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)
一个用字符串表示的时间加上或者减去一段时间
Duration endTiming()
停止计时
Duration checkTime()
计时过程中检查时间
static bool compareTime(const std::string &time1, const std::string &time2, const std::string &format1=ISO8086A, const std::string &format2=ISO8086A)
比较两个时间字符串表示的时间的大小
数据处理
文件相关:文件读写,日志等
网络框架,协议,通信,io多路复用相关
TLSState
Definition sttnet.h:3385
@ ESTABLISHED
Definition sttnet.h:3388
@ NONE
Definition sttnet.h:3386
@ ERROR
Definition sttnet.h:3389
@ HANDSHAKING
Definition sttnet.h:3387
TLSClientAuthMode
TLS 服务端对客户端证书的校验模式。
Definition sttnet.h:3393
@ None
Definition sttnet.h:3394
@ Required
Definition sttnet.h:3396
@ Optional
Definition sttnet.h:3395
涉及信息安全的api
Definition sttnet.h:2128
RateLimitType
限流算法类型(策略)。
Definition sttnet.h:2174
@ Cooldown
Definition sttnet.h:2175
@ SlidingWindow
Definition sttnet.h:2177
@ FixedWindow
Definition sttnet.h:2176
@ TokenBucket
Definition sttnet.h:2178
DefenseDecision
安全裁决结果(由 ConnectionLimiter 返回)。
Definition sttnet.h:2288
@ DROP
Definition sttnet.h:2290
@ ALLOW
Definition sttnet.h:2289
@ CLOSE
Definition sttnet.h:2291
系统的设置,进程的控制,心跳监控等
Definition sttnet.h:173
std::function< void()> Task
Definition sttnet.h:5079
时间相关操作,基础时间工具
std::ostream & operator<<(std::ostream &os, const Duration &a)
将 Duration 对象以可读格式输出到流中。
std::chrono::duration< uint64_t > Seconds
Definition sttnet.h:1152
std::chrono::duration< uint64_t, std::milli > Milliseconds
Definition sttnet.h:1151
constexpr int version_minor
Definition sttnet.h:168
constexpr int version_major
Definition sttnet.h:167
constexpr std::string_view version
Definition sttnet.h:170
constexpr int version_patch
Definition sttnet.h:169
FileThreadLock(const std::string &loc, const int &threads)
这个结构体的构造函数
Definition sttnet.h:453
int threads
记录文件正在被多少个线程使用
Definition sttnet.h:443
std::mutex lock
此文件的锁
Definition sttnet.h:447
std::string loc
文件路径
Definition sttnet.h:439
单个服务端连接的有界异步发送状态。
Definition sttnet.h:3456
std::deque< std::string > queue
Definition sttnet.h:3458
size_t queued_bytes
Definition sttnet.h:3460
int fd
Definition sttnet.h:3462
std::mutex mutex
Definition sttnet.h:3457
size_t max_queued_bytes
Definition sttnet.h:3461
uint64_t connection_obj_fd
Definition sttnet.h:3463
bool overflowed
Definition sttnet.h:3467
bool close_after_flush
Definition sttnet.h:3466
bool closed
Definition sttnet.h:3468
size_t front_offset
Definition sttnet.h:3459
bool notification_pending
Definition sttnet.h:3464
bool close_requested
Definition sttnet.h:3465
保存HTTP/HTTPS请求信息的结构体
Definition sttnet.h:3159
std::unordered_map< std::string, std::any > ctx
所需的数据仓库
Definition sttnet.h:3199
std::string type
请求类型
Definition sttnet.h:3171
int fd
底层的socket套接字
Definition sttnet.h:3163
std::string locPara
url中的路径和参数
Definition sttnet.h:3175
std::string_view bodyView() const noexcept
统一读取 Content-Length 或 chunked 请求体。
std::string body
请求体
Definition sttnet.h:3191
std::string para
url中的参数
Definition sttnet.h:3183
uint64_t connection_obj_fd
连接对象fd
Definition sttnet.h:3167
std::string loc
url中的路径
Definition sttnet.h:3179
std::string body_chunked
请求体(chunked)
Definition sttnet.h:3195
std::string header
请求头
Definition sttnet.h:3187
std::string_view headerValue(std::string_view name) const noexcept
按大小写不敏感方式读取请求头,不分配内存。
跨线程通知 Reactor 某连接有待发数据的轻量消息。
Definition sttnet.h:3473
uint64_t connection_obj_fd
Definition sttnet.h:3475
int fd
Definition sttnet.h:3474
TcpServer 运行指标的无锁快照。
Definition sttnet.h:3405
uint64_t accepted_connections
Definition sttnet.h:3406
uint64_t write_overflows
Definition sttnet.h:3418
uint64_t active_connections
Definition sttnet.h:3407
uint64_t write_syscalls
Definition sttnet.h:3424
uint64_t worker_task_rejections
Definition sttnet.h:3421
uint64_t tls_handshake_failures
Definition sttnet.h:3411
uint64_t reactor_wakeups
Definition sttnet.h:3422
uint64_t queued_write_bytes
Definition sttnet.h:3413
uint64_t sent_bytes
Definition sttnet.h:3414
uint64_t graceful_shutdown_timeouts
Definition sttnet.h:3429
uint64_t parsed_http_requests
Definition sttnet.h:3412
uint64_t idle_timeout_closes
Definition sttnet.h:3428
uint64_t closed_connections
Definition sttnet.h:3408
uint64_t batched_write_buffers
Definition sttnet.h:3426
uint64_t rejected_connections
Definition sttnet.h:3409
uint64_t accept_errors
Definition sttnet.h:3410
uint64_t worker_queue_overflows
Definition sttnet.h:3419
uint64_t peak_pending_worker_tasks
Definition sttnet.h:3417
uint64_t pending_write_bytes
Definition sttnet.h:3415
uint64_t idle_timeout_checks
Definition sttnet.h:3427
uint64_t batched_write_syscalls
Definition sttnet.h:3425
uint64_t reactor_wakeups_coalesced
Definition sttnet.h:3423
uint64_t send_ready_queue_overflows
Definition sttnet.h:3420
uint64_t peak_pending_write_bytes
Definition sttnet.h:3416
新连接的常用 TCP 套接字调优参数。
Definition sttnet.h:3437
int fast_open_queue
Definition sttnet.h:3447
bool tcp_no_delay
Definition sttnet.h:3438
bool keep_alive
Definition sttnet.h:3439
int receive_buffer_bytes
Definition sttnet.h:3441
int keep_alive_probe_count
Definition sttnet.h:3445
int send_buffer_bytes
Definition sttnet.h:3442
int keep_alive_idle_seconds
Definition sttnet.h:3443
int keep_alive_interval_seconds
Definition sttnet.h:3444
int defer_accept_seconds
Definition sttnet.h:3446
int listen_backlog
Definition sttnet.h:3448
bool reuse_port
Definition sttnet.h:3440
保存底层基础Tcp通道信息的结构体
Definition sttnet.h:3482
int status
当前fd的接收状态,用于保存接收处理机逻辑
Definition sttnet.h:3510
bool write_waiting_for_read
Definition sttnet.h:3539
std::queue< std::any > pendindQueue
等待处理的队列
Definition sttnet.h:3506
std::string ip
客户端ip
Definition sttnet.h:3494
bool write_interest
Definition sttnet.h:3538
unsigned long p_buffer_now
接收空间位置指针
Definition sttnet.h:3530
std::shared_ptr< ConnectionWriteState > write_state
Definition sttnet.h:3537
SSL * ssl
如果加密了,存放加密句柄
Definition sttnet.h:3518
char * buffer
接收空间指针
Definition sttnet.h:3526
int fd
套接字fd
Definition sttnet.h:3486
size_t active_workers
Definition sttnet.h:3534
bool closing
Definition sttnet.h:3536
unsigned long buffer_capacity
Definition sttnet.h:3532
TLSState tls_state
tls状态
Definition sttnet.h:3522
std::string port
客户端端口
Definition sttnet.h:3498
std::string_view data
保存收到的客户端传来的数据
Definition sttnet.h:3514
int FDStatus
记录当前处理状态机到第几步了
Definition sttnet.h:3502
uint64_t connection_obj_fd
连接对象fd
Definition sttnet.h:3490
保存Tcp客户端的信息
Definition sttnet.h:3366
std::string data
裸数据
Definition sttnet.h:3378
int fd
套接字fd
Definition sttnet.h:3370
uint64_t connection_obj_fd
连接对象fd
Definition sttnet.h:3374
std::unordered_map< std::string, std::any > ctx
所需的数据仓库
Definition sttnet.h:3382
保存客户端WS/WSS请求信息的结构体
Definition sttnet.h:3295
uint8_t fragmented_opcode
Definition sttnet.h:3345
std::unordered_map< std::string, std::any > ctx
所需的数据仓库
Definition sttnet.h:3355
bool closeflag
true:发送了关闭帧 false:没有发送关闭帧
Definition sttnet.h:3307
size_t recv_length
待接收的长度
Definition sttnet.h:3327
bool fin
fin的状态
Definition sttnet.h:3343
time_t response
上次收到信息的时间
Definition sttnet.h:3323
HttpRequestInformation httpinf
握手阶段保存的http信息
Definition sttnet.h:3359
int fd
底层的socket套接字
Definition sttnet.h:3299
std::string header
握手阶段的Http/Https请求头
Definition sttnet.h:3315
time_t HBTime
发送心跳的时间(没有发送过就填0) (检查完又要清空为0)
Definition sttnet.h:3319
std::string locPara
握手阶段的Http/Https路径和参数
Definition sttnet.h:3311
std::string fragmented_message
Definition sttnet.h:3347
int message_type
消息类型
Definition sttnet.h:3335
std::string mask
mask
Definition sttnet.h:3351
size_t have_recv_length
已经接收的长度
Definition sttnet.h:3331
std::string message
消息
Definition sttnet.h:3339
uint64_t connection_obj_fd
连接对象fd
Definition sttnet.h:3303
工作现场完成任务后压入完成队列的数据结构
Definition sttnet.h:3546
std::shared_ptr< void > request
Definition sttnet.h:3558
int fd
底层套接字
Definition sttnet.h:3550
uint64_t connection_obj_fd
Definition sttnet.h:3552
int ret
返回值 -2:失败并且要求关闭连接 -1:失败但不需要关闭连接 1:成功
Definition sttnet.h:3556
单个连接(fd)的安全与限流状态。
Definition sttnet.h:2230
RateState requestRate
Definition sttnet.h:2232
std::unordered_map< std::string, RateState > pathRate
Definition sttnet.h:2233
std::chrono::steady_clock::time_point lastActivity
Definition sttnet.h:2234
int fd
Definition sttnet.h:2231
单个 IP 的安全状态与连接集合。
Definition sttnet.h:2260
std::unordered_map< int, ConnectionState > conns
Definition sttnet.h:2264
int activeConnections
Definition sttnet.h:2261
int badScore
Definition sttnet.h:2263
RateState connectRate
Definition sttnet.h:2262
单一限流器的运行状态(可复用于多种限流策略)。
Definition sttnet.h:2200
std::deque< std::chrono::steady_clock::time_point > history
Definition sttnet.h:2207
int violations
Definition sttnet.h:2203
std::chrono::steady_clock::time_point lastRefill
Definition sttnet.h:2211
double tokens
Definition sttnet.h:2210
int counter
Definition sttnet.h:2202
std::chrono::steady_clock::time_point lastTime
Definition sttnet.h:2204
进程信息的结构体
Definition sttnet.h:4829
char argv0[20]
进程第一个参数
Definition sttnet.h:4845
char argv1[20]
进程第二个参数
Definition sttnet.h:4849
pid_t pid
进程id
Definition sttnet.h:4833
time_t lastTime
进程最后一次心跳时间,是时间戳
Definition sttnet.h:4837
char name[MAX_PROCESS_NAME]
进程名字
Definition sttnet.h:4841
char argv2[20]
进程第三个参数
Definition sttnet.h:4853
表示时间间隔的结构体,支持天、小时、分钟、秒和毫秒粒度。
Definition sttnet.h:855
bool operator<=(const Duration &b)
判断当前时间间隔是否小于等于另一个时间间隔。
Definition sttnet.h:950
bool operator>(const Duration &b)
判断当前时间间隔是否大于另一个时间间隔。
Definition sttnet.h:886
Duration operator+(const Duration &b)
将两个时间间隔相加。
Definition sttnet.h:966
Duration(long long a, int b, int c, int d, int e)
构造函数,传入天,时,分,秒,毫秒
Definition sttnet.h:879
int msec
毫秒
Definition sttnet.h:875
bool operator>=(const Duration &b)
判断当前时间间隔是否大于等于另一个时间间隔。
Definition sttnet.h:934
int sec
Definition sttnet.h:871
bool operator==(const Duration &b)
判断当前时间间隔是否等于另一个时间间隔。
Definition sttnet.h:918
double convertToHour()
将当前时间间隔转换为以“小时”为单位的浮点数表示。
Definition sttnet.h:1063
long long day
Definition sttnet.h:859
double convertToDay()
将当前时间间隔转换为以“天”为单位的浮点数表示。
Definition sttnet.h:1053
Duration operator-(const Duration &b)
计算两个时间间隔的差值(当前对象减去参数 b)。
Definition sttnet.h:1010
int min
Definition sttnet.h:867
bool operator<(const Duration &b)
判断当前时间间隔是否小于另一个时间间隔。
Definition sttnet.h:902
double convertToSec()
将当前时间间隔转换为以“秒”为单位的浮点数表示。
Definition sttnet.h:1083
Duration recoverForm(const long long &t)
从给定的毫秒数恢复为标准的天-时-分-秒-毫秒格式。
Definition sttnet.h:1104
int hour
Definition sttnet.h:863
long long convertToMsec()
将当前时间间隔转换为总毫秒数。
Definition sttnet.h:1093
double convertToMin()
将当前时间间隔转换为以“分钟”为单位的浮点数表示。
Definition sttnet.h:1073
#define ISO8086A
STTNet 历史本地时间文本格式宏:"yyyy-mm-ddThh:mi:ss"(不携带时区)
Definition sttnet.h:1156
#define MAX_PROCESS_NAME
定义MAX_PROCESS_NAME这个宏为100,意思是进程信息中的进程名字长度不超过100个字节
Definition sttnet.h:4811