9 #include<jsoncpp/json/json.h>
25 #include<openssl/sha.h>
29 #include<sys/socket.h>
31 #include<openssl/bio.h>
32 #include<openssl/evp.h>
33 #include<openssl/buffer.h>
38 #include<condition_variable>
40 #include<unordered_map>
41 #include <openssl/ssl.h>
42 #include <openssl/err.h>
43 #include<openssl/crypto.h>
76 static bool createDir(
const std::string & ddir,
const mode_t &mode=0775);
85 static bool copy(
const std::string &sourceFile,
const std::string &objectFile);
94 static bool createFile(
const std::string &filePath,
const mode_t &mode=0666);
139 static std::mutex
l1;
140 static std::unordered_map<std::string,FileThreadLock>
fl2;
149 std::vector<std::string> data;
150 std::vector<std::string> backUp;
151 char *data_binary=
nullptr;
152 char *backUp_binary=
nullptr;
156 size_t multiple_backup=0;
161 std::string fileName;
163 std::string fileNameTemp;
168 uint64_t totalLines=0;
213 bool openFile(
const std::string &fileName,
const bool &create=
true,
const int &multiple=0,
const size_t &size=0,
const mode_t &mode=0666);
296 int findC(
const std::string &targetString,
const int linePos=1);
306 bool appendLineC(
const std::string &data,
const int &linePos=0);
332 bool chgLineC(
const std::string &data,
const int &linePos=0);
342 bool readLineC(std::string &data,
const int linePos);
352 std::string&
readC(std::string &data,
const int &linePos,
const int &num);
359 std::string&
readAllC(std::string &data);
375 bool readC(
char *data,
const size_t &pos,
const size_t &size);
386 bool writeC(
const char *data,
const size_t &pos,
const size_t &size);
407 int find(
const std::string &targetString,
const int linePos=1);
417 bool appendLine(
const std::string &data,
const int &linePos=0);
443 bool chgLine(
const std::string &data,
const int &linePos=0);
453 bool readLine(std::string &data,
const int linePos);
463 std::string&
read(std::string &data,
const int &linePos,
const int &num);
470 std::string&
readAll(std::string &data);
486 bool read(
char *data,
const size_t &pos,
const size_t &size);
497 bool write(
const char *data,
const size_t &pos,
const size_t &size);
668 return Duration(dayy,hourr,minn,secc,msecc);
683 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;
712 return Duration(dayy,hourr,minn,secc,msecc);
722 double k=
day+total/86400000.0000;
732 double k=
day*24+
hour+total/36000000.0000;
742 double k=
day*24*60+
hour*60+
min+total/60000.0000;
814 std::ostream&
operator<<(std::ostream &os,
const Duration &a);
817 using Seconds=std::chrono::duration<uint64_t>;
821 #define ISO8086A "yyyy-mm-ddThh:mi:ss"
825 #define ISO8086B "yyyy-mm-ddThh:mi:ss.sss"
839 static std::string &toPGtimeFormat();
840 static std::chrono::system_clock::time_point strToTimePoint(
const std::string &timeStr,
const std::string &format=
ISO8086A);
841 static std::string& timePointToStr(
const std::chrono::system_clock::time_point &tp,std::string &timeStr,
const std::string &format=
ISO8086A);
850 static std::string&
getTime(std::string &timeStr,
const std::string &format=
ISO8086A);
859 static bool convertFormat(std::string &timeStr,
const std::string &oldFormat,
const std::string &newFormat=
ISO8086A);
880 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);
890 static bool compareTime(
const std::string &time1,
const std::string &time2,
const std::string &format1=
ISO8086A,
const std::string &format2=
ISO8086A);
894 std::chrono::steady_clock::time_point start;
895 std::chrono::steady_clock::time_point end;
935 std::string timeFormat;
936 std::string contentFormat;
946 bool openFile(
const std::string &fileName,
const std::string &timeFormat=
ISO8086A,
const std::string &contentFormat=
" ");
968 bool writeLog(
const std::string &data);
981 bool deleteLogByTime(
const std::string &date1=
"1",
const std::string &date2=
"2");
1007 static bool encryptSymmetric(
const unsigned char *before,
const size_t &length,
const unsigned char *passwd,
const unsigned char *iv,
unsigned char *after);
1018 static bool decryptSymmetric(
const unsigned char *before,
const size_t &length,
const unsigned char *passwd,
const unsigned char *iv,
unsigned char *after);
1031 static std::string&
sha1(
const std::string &ori_str,std::string &result);
1044 static std::string&
sha11(
const std::string &ori_str,std::string &result);
1059 static std::string&
bitOutput(
char input,std::string &result);
1067 static std::string&
bitOutput(
const std::string &input,std::string &result);
1076 static char&
bitOutput_bit(
char input,
const int pos,
char &result);
1084 static unsigned long&
bitStrToNumber(
const std::string &input,
unsigned long &result);
1094 static unsigned long&
bitToNumber(
const std::string &input,
unsigned long &result);
1102 static char&
toBit(
const std::string &input,
char &result);
1110 static std::string&
toBit(
const std::string &input,std::string &result);
1183 static std::string&
getPreciesFloat(
const float &number,
const int &bit,std::string &str);
1200 static std::string&
getPreciesDouble(
const double &number,
const int &bit,std::string &str);
1245 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);
1256 static std::string_view&
get_value_str(
const std::string_view& ori_str,std::string_view &str,
const std::string& name);
1265 static std::string_view&
get_value_header(
const std::string_view& ori_str,std::string_view &str,
const std::string& name);
1275 static std::string_view&
get_location_str(
const std::string_view& ori_str,std::string_view &str);
1285 static std::string_view&
getLocPara(
const std::string_view &url,std::string_view &locPara);
1294 static std::string_view&
getPara(
const std::string_view &url,std::string_view ¶);
1313 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);
1324 static std::string&
get_value_str(
const std::string& ori_str,std::string &str,
const std::string& name);
1333 static std::string&
get_value_header(
const std::string& ori_str,std::string &str,
const std::string& name);
1343 static std::string&
get_location_str(
const std::string& ori_str,std::string &str);
1353 static std::string&
getLocPara(
const std::string &url,std::string &locPara);
1362 static std::string&
getPara(
const std::string &url,std::string ¶);
1373 static std::string&
getIP(
const std::string &url,std::string &IP);
1384 static int&
getPort(
const std::string &url,
int &port);
1394 static std::string
createHeader(
const std::string& first,
const std::string& second);
1415 template<
class... Args>
1416 static std::string
createHeader(
const std::string& first,
const std::string& second,Args... args)
1418 std::string cf=first+
": "+second+
"\r\n"+
createHeader(args...);
1455 static int&
toInt(
const std::string_view&ori_str,
int &result,
const int &i=-1);
1462 static int&
str16toInt(
const std::string_view&ori_str,
int &result,
const int &i=-1);
1471 static long&
toLong(
const std::string_view&ori_str,
long &result,
const long &i=-1);
1480 static float&
toFloat(
const std::string&ori_str,
float &result,
const float &i=-1);
1489 static double&
toDouble(
const std::string&ori_str,
double &result,
const double &i=-1);
1497 static bool&
toBool(
const std::string_view&ori_str,
bool &result);
1508 static std::string&
strto16(
const std::string &ori_str,std::string &result);
1570 static std::string&
maskCalculate(std::string &data,
const std::string &mask);
1590 static int getValue(
const std::string &oriStr,std::string& result,
const std::string &type=
"value",
const std::string &name=
"a",
const int &num=0);
1597 static std::string
toString(
const Json::Value &val);
1603 static Json::Value
toJsonArray(
const std::string & str);
1613 template<
class T1,
class T2>
1618 Json::StreamWriterBuilder builder;
1619 std::string jsonString=Json::writeString(builder,root);
1633 template<
class T1,
class T2,
class... Args>
1639 Json::StreamWriterBuilder builder;
1640 std::string jsonString=Json::writeString(builder,root);
1641 jsonString=jsonString.erase(jsonString.length()-2);
1643 return jsonString+
","+kk;
1656 Json::Value root(Json::arrayValue);
1658 Json::StreamWriterBuilder builder;
1659 std::string jsonString=Json::writeString(builder,root);
1671 template<
class T,
class... Args>
1674 Json::Value root(Json::arrayValue);
1677 Json::StreamWriterBuilder builder;
1678 std::string jsonString=Json::writeString(builder,root);
1679 jsonString=jsonString.erase(jsonString.length()-2);
1681 return jsonString+
","+kk;
1690 static std::string
jsonAdd(
const std::string &a,
const std::string &b);
1697 static std::string&
jsonFormatify(
const std::string &a,std::string &b);
1704 static std::string&
jsonToUTF8(
const std::string &input,std::string &output);
1729 int connectionLimit;
1730 int connectionRateLimit;
1731 std::unordered_map<std::string,IPInformation> connectionTable;
1739 ConnectionLimiter(
const int &connectionLimit=20,
const int &connectionRateLimit=6):connectionLimit(connectionLimit),connectionRateLimit(connectionRateLimit){}
1745 bool allow(
const std::string &ip);
1750 void clearIP(
const std::string &ip);
1803 void close(
const bool &cle=
true);
1841 int sendData(
const std::string &data,
const bool &block=
true);
1861 int sendData(
const char *data,
const uint64_t &length,
const bool &block=
true);
1906 int recvData(std::string &data,
const uint64_t &length);
1919 int recvData(
char *data,
const uint64_t &length);
1929 std::string serverIP=
"";
1933 SSL_CTX *ctx=
nullptr;
1940 void closeAndUnCreate();
1941 bool initCTX(
const char *ca,
const char *cert=
"",
const char *key=
"",
const char *passwd=
"");
1955 TcpClient(
const bool &TLS=
false,
const char *ca=
"",
const char *cert=
"",
const char *key=
"",
const char *passwd=
"");
1962 bool connect(
const std::string &ip,
const int &port);
1976 void resetCTX(
const bool &TLS=
false,
const char *ca=
"",
const char *cert=
"",
const char *key=
"",
const char *passwd=
"");
2028 HttpClient(
const bool &TLS=
false,
const char *ca=
"",
const char *cert=
"",
const char *key=
"",
const char *passwd=
""):
TcpClient(TLS,ca,cert,key,passwd){}
2042 bool getRequest(
const std::string &url,
const std::string &
header=
"",
const std::string &header1=
"Connection: keep-alive",
const int &
sec=-1);
2056 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);
2071 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);
2087 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);
2112 std::function<bool(const int &fd)> fc=[](
const int &fd)->
bool
2114 std::function<void(const int &fd)> fcEnd=[](
const int &fd)->
void
2116 std::function<bool(const int &fd)> fcTimeOut=[](
const int &fd)->
bool
2200 std::function<bool(const std::string &message,WebSocketClient &k)> fc=[](
const std::string &message,
WebSocketClient &k)->
bool
2201 {std::cout<<
"收到: "<<message<<std::endl;
return true;};
2220 WebSocketClient(
const bool &TLS=
false,
const char *ca=
"",
const char *cert=
"",
const char *key=
"",
const char *passwd=
""):
TcpClient(TLS,ca,cert,key,passwd){}
2238 bool connect(
const std::string &url,
const int &min=20);
2261 bool sendMessage(
const std::string &message,
const std::string &type=
"0001");
2271 void close(
const std::string &closeCodeAndMessage,
const bool &wait=
true);
2289 void close(
const short &code=1000,
const std::string &message=
"bye",
const bool &wait=
true);
2391 bool sendBack(
const std::string &data,
const std::string &header=
"",
const std::string &code=
"200 OK",
const std::string &header1=
"");
2404 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);
2542 std::condition_variable *
cv;
2558 std::function<bool(TcpFDHandler &k,TcpFDInf &inf)> fc;
2564 void epolll(
const int &evsNum);
2565 virtual void consumer(
const int &threadID);
2579 TcpServer(
const int &
maxFD=10000,
const bool &
security_open=
true,
const int &connectionNumLimit=20,
const int &connectionRateLimit=6,
const int &
buffer_size=8,
const int &
requestRate=12,
const int &
checkFrequency=1,
const int &
connectionTimeout=1800):
maxFD(
maxFD),
connectionLimiter(connectionNumLimit,connectionRateLimit),
security_open(
security_open),
buffer_size(
buffer_size*1024),
requestRate(
requestRate),
checkFrequency(
checkFrequency),
connectionTimeout(
connectionTimeout){}
2586 bool startListen(
const int &port,
const int &threads=8);
2613 bool setTLS(
const char *cert,
const char *key,
const char *passwd,
const char *ca);
2647 bool close(
const int &fd);
2658 SSL*
getSSL(
const int &fd);
2676 std::function<bool(const HttpRequestInformation &inf,HttpServerFDHandler &k)> fc;
2678 void consumer(
const int &threadID);
2692 HttpServer(
const int &
maxFD=10000000,
const bool &
security_open=
true,
const int &connectionNumLimit=20,
const int &connectionRateLimit=6,
const int &
buffer_size=8,
const int &
requestRate=12,
const int &
checkFrequency=1,
const int &
connectionTimeout=60):
TcpServer(
maxFD,
security_open,connectionNumLimit,connectionRateLimit,
buffer_size,
requestRate,
checkFrequency,
connectionTimeout){}
2756 bool sendMessage(
const std::string &msg,
const std::string &type=
"0001");
2766 std::unordered_map<int,WebSocketFDInformation> wbclientfd;
2768 std::function<bool(const std::string &msg,WebSocketServer &k,const WebSocketFDInformation &inf)> fc=[](
const std::string &message,
WebSocketServer &k,
const WebSocketFDInformation &inf)->
bool
2769 {std::cout<<
"收到: "<<message<<std::endl;
return true;};
2781 void consumer(
const int &threadID);
2783 void closeAck(
const int &fd,
const std::string &closeCodeAndMessage);
2784 void closeAck(
const int &fd,
const short &code=1000,
const std::string &message=
"bye");
2786 bool closeWithoutLock(
const int &fd,
const std::string &closeCodeAndMessage);
2787 bool closeWithoutLock(
const int &fd,
const short &code=1000,
const std::string &message=
"bye");
2799 WebSocketServer(
const int &
maxFD=10000000,
const bool &
security_open=
true,
const int &connectionNumLimit=20,
const int &connectionRateLimit=6,
const int &
buffer_size=8,
const int &
requestRate=12):
TcpServer(
maxFD,
security_open,connectionNumLimit,connectionRateLimit,
buffer_size,
requestRate,-1,-1){}
2853 bool close(
const int &fd,
const std::string &closeCodeAndMessage);
2873 bool close(
const int &fd,
const short &code=1000,
const std::string &message=
"bye");
2911 std::thread(&WebSocketServer::HB,
this).detach();
2935 void sendMessage(
const std::string &msg,
const std::string &type=
"0001");
2962 void setFD(
const int &fd,
const bool &
flag1=
false,
const int &
sec=-1,
const bool &
flag2=
false);
2985 void close(
const bool &cle=
true);
3004 int sendData(
const std::string &data,
const std::string &ip,
const int &port,
const bool &block=
true);
3024 int sendData(
const char *data,
const uint64_t &length,
const std::string &ip,
const int &port,
const bool &block=
true);
3039 int recvData(std::string &data,
const uint64_t &length,std::string &ip,
int &port);
3054 int recvData(
char *data,
const uint64_t &length,std::string &ip,
int &port);
3180 struct semid_ds *buf;
3181 unsigned short *arry;
3206 bool init(key_t key,
unsigned short value = 1,
short sem_flg = SEM_UNDO);
3216 bool wait(
short value = -1);
3226 bool post(
short value = 1);
3253 #define MAX_PROCESS_NAME 100
3257 #define MAX_PROCESS_INF 1000
3261 #define SHARED_MEMORY_KEY 0x5095
3265 #define SHARED_MEMORY_LOCK_KEY 0x5095
3321 bool join(
const char *name,
const char *argv0=
"",
const char *argv1=
"",
const char *argv2=
"");
3337 static bool HBCheck(
const int &sec);
3378 template<
class... Args>
3379 static bool startProcess(
const std::string &name,
const int &sec=-1,Args ...args)
3381 std::vector<const char *> paramList={args...,
nullptr};
3391 execv(name.c_str(),
const_cast<char* const*
>(paramList.data()));
3395 for(
int ii=1;ii<=64;ii++)
3406 signal(SIGCHLD,SIG_DFL);
3413 execv(name.c_str(),
const_cast<char* const*
>(paramList.data()));
3448 template<
class Fn,
class... Args>
3449 static typename std::enable_if<!std::is_convertible<Fn, std::string>::value,
bool>::type
3461 auto f=std::bind(std::forward<Fn>(fn),std::forward<Args>(args)...);
3466 for(
int ii=1;ii<=64;ii++)
3477 signal(SIGCHLD,SIG_DFL);
3484 auto f=std::bind(std::forward<Fn>(fn),std::forward<Args>(args)...);
struct HttpRequestInformation HttpInf
保存http/https协议的信息
Definition: sttnet.h:2485
static std::string & transfer_websocket_key(std::string &str)
生成 WebSocket 握手响应中的 Sec-WebSocket-Accept 字段值。
限制同一ip连接的类
Definition: sttnet.h:1726
int sendData(const std::string &data, const std::string &ip, const int &port, const bool &block=true)
向目标发送字符串数据。
std::chrono::duration< uint64_t > Seconds
Definition: sttnet.h:817
bool operator>(const Duration &b)
判断当前时间间隔是否大于另一个时间间隔。
Definition: sttnet.h:551
int getServerPort()
返回已连接的客户端的端口 return 已连接的服务端的端口
Definition: sttnet.h:1996
SSL * getSSL()
获取该对象的加密SSL句柄
Definition: sttnet.h:1798
void setStartFunction(std::function< void(const WebSocketFDInformation &inf, WebSocketServer &k)> fccc)
设置websocket连接成功后就执行的回调函数 注册一个回调函数
Definition: sttnet.h:2808
int checkFrequency
Definition: sttnet.h:2551
bool isStart()
返回本对象计时状态
Definition: sttnet.h:923
int fd
Definition: sttnet.h:1768
bool connect(const std::string &ip, const int &port)
向服务端发起tcp连接
TcpFDInf * clientfd
Definition: sttnet.h:2537
~WebSocketClient()
WebSocketClient类的析构函数,销毁对象时候会优雅退出断开连接
std::string getServerIp()
如果连接到了服务器 返回服务器ip
Definition: sttnet.h:2305
bool unblock
Definition: sttnet.h:2545
void setFD(const int &fd, SSL *ssl=nullptr, const bool &flag1=false, const bool &flag2=true)
初始化对象,传入套接字等参数
Definition: sttnet.h:2367
tcp协议的套接字操作类
Definition: sttnet.h:1765
消息队列元素的结构体
Definition: sttnet.h:2512
bool readLine(std::string &data, const int linePos)
读取单行
bool writeLog(const std::string &data)
写一行日志
static std::string createJson(T1 first, T2 second, Args...args)
创建多个键值对组成的 JSON 字符串(递归变参模板)。
Definition: sttnet.h:1634
std::string & readAll(std::string &data)
读取全部
表示时间间隔的结构体,支持天、小时、分钟、秒和毫秒粒度。
Definition: sttnet.h:519
std::string & readAllC(std::string &data)
读取全部
WebSocket协议的操作类 仅传入套接字,然后使用这个类进行WebSocket的操作
Definition: sttnet.h:2709
static void setLogFile(file::LogFile *logfile=nullptr, const std::string &language="")
设置日志系统的日志文件对象 传入的日志文件对象如果是没初始化的空的对象,系统自动在程序目录下生成server_log文件夹并且根据当前时间生成一个日志文件记录服务程序的网络通信 如果传入的日志文件对象是...
static void init(file::LogFile *logfile=nullptr, const std::string &language="")
执行setExceptionHandling和setLogFile两个函数,完成初始化信号和日志系统
bool isConnect()
判断对象是否有套接字绑定
Definition: sttnet.h:1821
时间操作、运算、计时的类
Definition: sttnet.h:834
bool createFD(const int &port, const bool &flag1=false, const int &sec=-1, const bool &flag2=true)
销毁原来的套接字,重新创建一个服务端
int getFD()
获取该对象的套接字
Definition: sttnet.h:1793
static long getRandomNumber(const long &a, const long &b)
生成一个随机整数
static int & str16toInt(const std::string_view &ori_str, int &result, const int &i=-1)
16进制数字的字符串表示转化为10进制int类型数字
bool deleteLine(const int &linePos=0)
删除行
void waitAndQuit(const time::Duration &t=time::Duration{0, 0, 0, 10, 10})
开始退出epoll倒计时,直到套接字有新的消息 如果套接字倒计时结束还没有新的消息,那么退出epoll
Definition: sttnet.h:2183
bool connect(const std::string &url, const int &min=20)
连接到websocket服务器
bool operator<=(const Duration &b)
判断当前时间间隔是否小于等于另一个时间间隔。
Definition: sttnet.h:615
static std::string & sha11(const std::string &ori_str, std::string &result)
计算输入字符串的 SHA-1 哈希值,并以十六进制字符串形式返回。
Http/HttpServer 服务端操作类
Definition: sttnet.h:2673
int recvData(std::string &data, const uint64_t &length, std::string &ip, int &port)
接收一次数据到string字符串容器
int sendData(const std::string &data, const bool &block=true)
向已连接的套接字发送字符串数据。
bool sendMessage(const int &fd, const std::string &msg, const std::string &type="0001")
发送 WebSocket 消息给某一个客户端
Definition: sttnet.h:2897
std::mutex * lq1
Definition: sttnet.h:2540
pid_t pid
进程id
Definition: sttnet.h:3275
bool allow(const std::string &ip)
根据连接数和速度判断是否允许某ip的连接
WebSocketClient(const bool &TLS=false, const char *ca="", const char *cert="", const char *key="", const char *passwd="")
WebSocketClient类的构造函数
Definition: sttnet.h:2220
Duration operator+(const Duration &b)
将两个时间间隔相加。
Definition: sttnet.h:631
void setFunction(std::function< bool(const std::string &msg, WebSocketServer &k, const WebSocketFDInformation &inf)> fc)
设置收到客户端消息后的回调函数 注册一个回调函数
Definition: sttnet.h:2830
Duration(long long a, int b, int c, int d, int e)
构造函数,传入天,时,分,秒,毫秒
Definition: sttnet.h:544
bool post(short value=1)
V 操作(释放),尝试将信号量值加上 value。
int getFD()
返回fd
Definition: sttnet.h:2980
static unsigned long & htonl_ntohl_64(unsigned long &data)
将 64 位无符号整数的字节序反转(大端 <-> 小端)。
char argv1[20]
进程第二个参数
Definition: sttnet.h:3291
bool writeC(const char *data, const size_t &pos, const size_t &size)
写数据块
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请求到服务器
std::string loc
文件路径
Definition: sttnet.h:113
unsigned long p_buffer_now
接收空间位置指针
Definition: sttnet.h:2497
bool isConnect()
返回对象的连接状态
Definition: sttnet.h:2001
std::ostream & operator<<(std::ostream &os, const Duration &a)
将 Duration 对象以可读格式输出到流中。
int sec
秒
Definition: sttnet.h:536
~TcpServer()
TcpServer 类的析构函数
Definition: sttnet.h:2663
double convertToMin()
将当前时间间隔转换为以“分钟”为单位的浮点数表示。
Definition: sttnet.h:738
int recvDataByLength(std::string &data, const uint64_t &length, const int &sec=2)
从已连接的套接字中阻塞接收指定长度的数据到字符串
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 & generateMask_4(std::string &mask)
生成一个 32 位(4 字节)的随机掩码。
static long & toLong(const std::string_view &ori_str, long &result, const long &i=-1)
string转化为long类型
static std::string & getRandomStr_base64(std::string &str, const int &length)
生成一个规定长度的“Base64 字符集内的伪随机字符串”,并在末尾用 '=' 补齐至符合 Base64 字符串格式
static float & toFloat(const std::string &ori_str, float &result, const float &i=-1)
string转化为float类型
unsigned long buffer_size
Definition: sttnet.h:2532
std::string getServerPort()
如果连接到了服务器 返回服务器端口
Definition: sttnet.h:2310
bool closeFile(const bool &del=false)
关闭对象打开的日志文件
TcpClient(const bool &TLS=false, const char *ca="", const char *cert="", const char *key="", const char *passwd="")
TcpClient类的构造函数
bool close
是不是关闭消息
Definition: sttnet.h:2521
HttpServer(const int &maxFD=10000000, const bool &security_open=true, const int &connectionNumLimit=20, const int &connectionRateLimit=6, const int &buffer_size=8, const int &requestRate=12, const int &checkFrequency=1, const int &connectionTimeout=60)
构造函数,默认是启用安全模块。限制一个ip最大连接为20;同一个ip每秒最快连接速度为6
Definition: sttnet.h:2692
void setTimeOutFunction(std::function< bool(const int &fd)> fcTimeOut)
设置epoll超时后出发的回调函数 注册一个回调函数
Definition: sttnet.h:2166
bool flag2
Definition: sttnet.h:1770
Duration recoverForm(const long long &t)
从给定的毫秒数恢复为标准的天-时-分-秒-毫秒格式。
Definition: sttnet.h:769
static std::string createArray(T first)
创建只包含一个元素的 JSON 数组字符串。
Definition: sttnet.h:1654
void close(const bool &cle=true)
置空对象,关闭套接字
UdpClient(const bool &flag1=false, const int &sec=-1)
构造函数
负责字符串和数字的转化
Definition: sttnet.h:1444
~EpollSingle()
EpollSingle的析构函数 调用eldListen阻塞退出epoll.
Definition: sttnet.h:2188
int threads
记录文件正在被多少个线程使用
Definition: sttnet.h:117
static double & toDouble(const std::string &ori_str, double &result, const double &i=-1)
string转化为double类型
static std::string language
系统的日志系统的语言选择,默认为English
Definition: sttnet.h:3130
static std::string & getPreciesFloat(const float &number, const int &bit, std::string &str)
将浮点数格式化为指定小数位数的字符串表示。
负责进程心跳监控,调度的类 用于监控服务进程,保证服务进程持续有效运行 进程结束后,0x5095这一块共享内存和信号量都没有删掉 目前只支持最多三个参数的进程加入监控 应该自己手动在程序编写加入心跳监控...
Definition: sttnet.h:3305
bool flag1
Definition: sttnet.h:1769
void startListen(const int &fd, const bool &flag=true, const time::Duration &dt=time::Duration{0, 0, 20, 0, 0})
开始监听
Duration checkTime()
计时过程中检查时间
size_t getFileSize()
获取二进制打开的文件的大小
Definition: sttnet.h:257
Tcp服务端类
Definition: sttnet.h:2529
static std::string createArray(T first, Args...args)
创建多个元素组成的 JSON 数组字符串(递归变参模板)。
Definition: sttnet.h:1672
int fd
套接字
Definition: sttnet.h:2517
static std::mutex l1
Definition: sttnet.h:139
bool startListen(const int &port, const int &threads=8)
打开Tcp服务器监听程序
std::string port
客户端端口
Definition: sttnet.h:2473
UDP操作的类 传入套接字进行UDP协议的操作
Definition: sttnet.h:2947
void blockSet(const int &sec=-1)
设置对象中的套接字为阻塞模式
int recvData(std::string &data, const uint64_t &length)
从已连接的套接字中接收一次数据到string字符串容器
bool flag1
Definition: sttnet.h:2951
size_t getSize1()
获取二进制打开的文件在内存中的大小
Definition: sttnet.h:266
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:3450
~File()
析构函数
Definition: sttnet.h:224
static std::string_view & get_location_str(const std::string_view &ori_str, std::string_view &str)
提取 URL 中 path 和 query 部分。
HttpClient(const bool &TLS=false, const char *ca="", const char *cert="", const char *key="", const char *passwd="")
HttpClient类的构造函数
Definition: sttnet.h:2028
TcpServer(const int &maxFD=10000, const bool &security_open=true, const int &connectionNumLimit=20, const int &connectionRateLimit=6, const int &buffer_size=8, const int &requestRate=12, const int &checkFrequency=1, const int &connectionTimeout=1800)
构造函数,默认是启用安全模块。限制一个ip最大连接为20;同一个ip每秒最快连接速度为6
Definition: sttnet.h:2579
static std::string_view & getLocPara(const std::string_view &url, std::string_view &locPara)
提取 URL 的 path 部分(不含 query)。
WebSocketServer服务端操作类
Definition: sttnet.h:2763
解析,响应Http/https请求的操作类 仅传入套接字,然后使用这个类进行Http的操作
Definition: sttnet.h:2357
int getMessage(TcpFDInf &Tcpinf, WebSocketFDInformation &Websocketinf, const int &ii=1)
获取一条websocket消息
bool chgLineC(const std::string &data, const int &linePos=0)
修改行
bool operator<(const Duration &b)
判断当前时间间隔是否小于另一个时间间隔。
Definition: sttnet.h:567
bool isConnect()
返回连接状态
Definition: sttnet.h:2295
static bool HBCheck(const int &sec)
检查心跳监控系统 如果上一次心跳更新的时间和现在的时候相差大于等于sec秒,则杀死进程 先发送信号15杀死进程 如果8秒后进程还存在 则发送信号9强制杀死
负责加密,解密和哈希
Definition: sttnet.h:994
负责浮点数精度处理
Definition: sttnet.h:1171
static std::string & sha1(const std::string &ori_str, std::string &result)
计算输入字符串的 SHA-1 哈希值(原始二进制形式)。
SSL_CTX * ctx
Definition: sttnet.h:2546
bool deleteLogByTime(const std::string &date1="1", const std::string &date2="2")
删除指定时间区间内的日志
std::string & read(std::string &data, const int &linePos, const int &num)
读取行
static void list()
输出心跳监控系统的所有进程的信息
static std::string & jsonToUTF8(const std::string &input, std::string &output)
将 JSON 字符串中的 转换为 UTF-8 字符。
负责二进制数据,字符串之间的转化
Definition: sttnet.h:1049
static unsigned long & bitToNumber(const std::string &input, unsigned long &result)
将字符串转换为二进制,再转换为对应数值。
json数据操作类
Definition: sttnet.h:1575
int maxFD
Definition: sttnet.h:2533
static std::string & generateMask_4(std::string &mask)
生成一个 32 位(4 字节)的随机掩码。
static Duration & calculateTime(const std::string &time1, const std::string &time2, Duration &result, const std::string &format1=ISO8086A, const std::string &format2=ISO8086A)
计算两个用字符串表示的时间相减的差值
static Json::Value toJsonArray(const std::string &str)
解析 JSON 字符串为 Json::Value。
ConnectionLimiter(const int &connectionLimit=20, const int &connectionRateLimit=6)
ConnectionLimiter 的构造函数
Definition: sttnet.h:1739
进程信息的结构体
Definition: sttnet.h:3270
std::string & readC(std::string &data, const int &linePos, const int &num)
读取行
static std::unordered_map< std::string, FileThreadLock > fl2
Definition: sttnet.h:140
void resetCTX(const bool &TLS=false, const char *ca="", const char *cert="", const char *key="", const char *passwd="")
重新或第一次设置TLS加密参数
bool getRequest(const std::string &url, const std::string &header="", const std::string &header1="Connection: keep-alive", const int &sec=-1)
发送一个GET请求到服务器
static std::string base64_encode(const std::string &input)
对字符串进行 Base64 编码。
bool deleteLineC(const int &linePos=0)
删除行
bool multiUseSet()
设置SO_REUSEADDR模式
#define MAX_PROCESS_NAME
定义MAX_PROCESS_NAME这个宏为100,意思是进程信息中的进程名字长度不超过100个字节
Definition: sttnet.h:3253
void setJudgeFunction(std::function< bool(const WebSocketFDInformation &k)> fcc)
设置websocket握手阶段的检查函数,只有检查通过才执行后续握手 注册一个回调函数
Definition: sttnet.h:2818
static std::string createHeader(const std::string &first, const std::string &second)
创建一个 HTTP 请求头字段字符串。
tcp协议客户端操作类
Definition: sttnet.h:1926
负责Http字符串和URL解析 包括从 URL 或请求报文中提取参数、IP、端口、请求头字段等功能。
Definition: sttnet.h:1226
double convertToHour()
将当前时间间隔转换为以“小时”为单位的浮点数表示。
Definition: sttnet.h:728
csemp()
构造函数,初始化内部状态。
Definition: sttnet.h:3194
time_t lastTime
进程最后一次心跳时间,是时间戳
Definition: sttnet.h:3279
long long day
天
Definition: sttnet.h:524
static int & getPort(const std::string &url, int &port)
从 URL 中提取端口号。
int sec
Definition: sttnet.h:2953
static void setExceptionHandling()
设置系统的信号
bool chgLine(const std::string &data, const int &linePos=0)
修改行
static std::string & strto16(const std::string &ori_str, std::string &result)
将普通字符串转化为对应的十六进制表示字符串(hex string)。
void redrawTLS()
撤销TLS加密,ca证书等
bool close()
如果对象有套接字连接,关闭和释放这个连接和套接字,并且重新新建一个套接字。
std::mutex lock
此文件的锁
Definition: sttnet.h:121
int min
分
Definition: sttnet.h:532
std::queue< QueueFD > * fdQueue
Definition: sttnet.h:2539
void endListenWithSignal()
发送结束epoll的信号
Definition: sttnet.h:2177
static float & getValidFloat(float &number, const int &bit)
根据数值动态调整小数精度,保留指定数量的有效数字。
bool unlockMemory(const bool &rec=false)
把数据从内存写入磁盘
SSL * ssl
Definition: sttnet.h:1771
Duration operator-(const Duration &b)
计算两个时间间隔的差值(当前对象减去参数 b)。
Definition: sttnet.h:675
bool readLineC(std::string &data, const int linePos)
读取单行
static bool & toBool(const std::string_view &ori_str, bool &result)
string转化为bool类型
static char & toBit(const std::string &input, char &result)
将最多 8 位的 "01" 字符串压缩成 1 个字节(char)。
bool createFD(const bool &flag1=false, const int &sec=-1)
销毁原来的套接字,重新创建一个客户端
char argv2[20]
进程第三个参数
Definition: sttnet.h:3295
UdpServer(const int &port, const bool &flag1=false, const int &sec=-1, const bool &flag2=true)
构造函数
static std::string toString(const Json::Value &val)
将 Json::Value 转换为字符串。
bool write(const char *data, const size_t &pos, const size_t &size)
写数据块
bool allowRequest(const int &cclientfd)
bool TLS
Definition: sttnet.h:2547
double convertToSec()
将当前时间间隔转换为以“秒”为单位的浮点数表示。
Definition: sttnet.h:748
static std::string base64_decode(const std::string &input)
对 Base64 编码的字符串进行解码。
std::string getUrl()
如果连接到了服务器 返回url
Definition: sttnet.h:2300
static file::LogFile * logfile
系统的日志系统的读写日志对象的指针
Definition: sttnet.h:3126
static std::string createHeader(const std::string &first, const std::string &second, Args...args)
递归构造多个 HTTP 请求头字段。
Definition: sttnet.h:1416
用epoll监听单个句柄
Definition: sttnet.h:2107
static std::string & transfer_websocket_key(std::string &str)
生成 WebSocket 握手响应中的 Sec-WebSocket-Accept 字段值。
int consumerNum
Definition: sttnet.h:2543
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请求到服务器
int requestRate
Definition: sttnet.h:2550
bool sendMessage(const std::string &message, const std::string &type="0001")
发送 WebSocket 消息
bool flag3
如果sendData的block=true,如果发送过程中连接断开,这个标志位会置为true
Definition: sttnet.h:1777
bool lockMemory()
把数据从磁盘读入内存
bool sendMessage(const std::string &msg, const std::string &type="0001")
发送一条websocket信息
static std::string & bitOutput(char input, std::string &result)
将单个字符转换为其对应的 8 位二进制字符串。
void setFD(const int &fd, SSL *ssl=nullptr, const bool &flag1=false, const bool &flag2=true)
初始化对象,传入套接字等参数
Definition: sttnet.h:2719
FileThreadLock(const std::string &loc, const int &threads)
这个结构体的构造函数
Definition: sttnet.h:127
bool operator>=(const Duration &b)
判断当前时间间隔是否大于等于另一个时间间隔。
Definition: sttnet.h:599
std::condition_variable * cv
Definition: sttnet.h:2542
bool wait(short value=-1)
P 操作(等待),尝试将信号量值减去 value。
int fd
Definition: sttnet.h:2950
std::string getFileName()
获取打开的文件名字
Definition: sttnet.h:239
~TcpClient()
TcpClient的析构函数,会关闭释放套接字和其连接
Definition: sttnet.h:1985
static std::string_view & getPara(const std::string_view &url, std::string_view ¶)
获取 URL 中的查询参数字符串(包括 ?)。
void setEndFunction(std::function< void(const int &fd)> fcEnd)
设置epoll退出前的回调函数 注册一个回调函数
Definition: sttnet.h:2156
std::string body
服务器返回响应体
Definition: sttnet.h:2101
static std::string & getIP(const std::string &url, std::string &IP)
从 URL 中提取主机 IP 或域名。
负责websocket协议有关字符串的操作
Definition: sttnet.h:1425
Duration getDt()
获取上一次计时的时间
Definition: sttnet.h:918
数据编码解码,掩码处理等
Definition: sttnet.h:1513
int findC(const std::string &targetString, const int linePos=1)
查找行
~UdpServer()
析构函数,对象生命结束会会关闭套接字
Definition: sttnet.h:3103
HttpServerFDHandler k
处理http的类
Definition: sttnet.h:2502
bool operator==(const Duration &b)
判断当前时间间隔是否等于另一个时间间隔。
Definition: sttnet.h:583
bool appendLineC(const std::string &data, const int &linePos=0)
插入行
std::deque< std::chrono::steady_clock::time_point > requestSpeedQueue
用于请求限速的队列,实现滑动窗口算法
Definition: sttnet.h:2506
bool deleteFromHBS()
把当前进程从心跳系统中删除
bool join(const char *name, const char *argv0="", const char *argv1="", const char *argv2="")
把进程加入到心跳系统
void close(const bool &cle=true)
关闭对象
char * buffer
接收空间指针
Definition: sttnet.h:2493
static unsigned long & bitStrToNumber(const std::string &input, unsigned long &result)
将 "01" 字符串(二进制字符串)转换为无符号整数。
记录文件和线程关系的结构体
Definition: sttnet.h:108
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)
从原始字符串中提取两个标记之间的子串。
int status
当前fd的状态,用于保存处理机逻辑
Definition: sttnet.h:2477
bool init(key_t key, unsigned short value=1, short sem_flg=SEM_UNDO)
初始化信号量。
int sec
Definition: sttnet.h:1772
static bool convertFormat(std::string &timeStr, const std::string &oldFormat, const std::string &newFormat=ISO8086A)
转化时间字符串的格式
初始化服务系统的类
Definition: sttnet.h:3120
~UdpClient()
析构函数,对象生命结束会会关闭套接字
Definition: sttnet.h:3078
bool close()
关闭监听和所有已连接的套接字
uint64_t getFileLine()
获取打开的文件的行数
Definition: sttnet.h:248
void setFD(const int &fd, const bool &flag1=false, const int &sec=-1, const bool &flag2=false)
设置fd
bool isOpen()
判断对象是否打开了文件
Definition: sttnet.h:229
int flag1
Definition: sttnet.h:2538
bool isReturn()
获取服务器返回响应状态
Definition: sttnet.h:2093
std::string_view data
保存收到的客户端传来的数据
Definition: sttnet.h:2481
std::chrono::duration< uint64_t, std::milli > Milliseconds
Definition: sttnet.h:816
bool flag2
Definition: sttnet.h:2952
WebSocketServer(const int &maxFD=10000000, const bool &security_open=true, const int &connectionNumLimit=20, const int &connectionRateLimit=6, const int &buffer_size=8, const int &requestRate=12)
构造函数,默认是启用安全模块。限制一个ip最大连接为20;同一个ip每秒最快连接速度为6
Definition: sttnet.h:2799
static std::string & jsonFormatify(const std::string &a, std::string &b)
将格式化后的 JSON 字符串去除缩进、空格等变成紧凑格式。
std::string header
服务器返回响应头
Definition: sttnet.h:2097
bool openFile(const std::string &fileName, const bool &create=true, const int &multiple=0, const size_t &size=0, const mode_t &mode=0666)
打开文件
static std::string & maskCalculate(std::string &data, const std::string &mask)
使用给定的 4 字节掩码对字符串进行异或操作(XOR Masking)。
Websocket客户端操作的类 -如果需要重新设置TLS/Https加密的证书,目前需要销毁对象后重新构造 底层TCP默认是阻塞的
Definition: sttnet.h:2196
bool isBinary()
判断对象是否以二进制模式打开文件
Definition: sttnet.h:234
void blockSet(const int &sec=-1)
设置为阻塞模式
void setFD(const int &fd, SSL *ssl, const bool &flag1=false, const bool &flag2=false, const int &sec=-1)
传入套接字初始化对象
std::string getServerIP()
返回已连接的服务端的ip return 已连接的服务端的ip
Definition: sttnet.h:1991
int solveRequest(TcpFDInf &TcpInf, const unsigned long &buffer_size, const int ×=1)
解析Http/Https请求
static std::string & getPreciesDouble(const double &number, const int &bit, std::string &str)
将双精度浮点数格式化为指定小数位数的字符串表示。
封装 System V 信号量的同步工具类。
Definition: sttnet.h:3169
bool openFile(const std::string &fileName, const std::string &timeFormat=ISO8086A, const std::string &contentFormat=" ")
打开一个日志文件
负责大小端字节序转换
Definition: sttnet.h:1151
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模式对称加密函数
~WebSocketServer()
WebSocketServer的析构函数
Definition: sttnet.h:2940
std::mutex che
Definition: sttnet.h:142
bool startListen(const int &port, const int &threads=8)
打开Websocket服务器监听程序
Definition: sttnet.h:2909
std::string getFileName()
获取对象打开的文件名
Definition: sttnet.h:956
udp服务端的操作类
Definition: sttnet.h:3083
double convertToDay()
将当前时间间隔转换为以“天”为单位的浮点数表示。
Definition: sttnet.h:718
bool isListen()
返回epoll监听状态
Definition: sttnet.h:2138
Http/Https客户端操作类
Definition: sttnet.h:2011
char argv0[20]
进程第一个参数
Definition: sttnet.h:3287
int fd
套接字fd
Definition: sttnet.h:2465
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 security_open
Definition: sttnet.h:2553
bool setTLS(const char *cert, const char *key, const char *passwd, const char *ca)
启用 TLS 加密并配置服务器端证书与密钥
进程管理的静态工具类
Definition: sttnet.h:3353
static std::string_view & get_value_str(const std::string_view &ori_str, std::string_view &str, const std::string &name)
从 URL 查询参数中提取指定 key 的值。
bool sendBack(const std::string &data, const std::string &header="", const std::string &code="200 OK", const std::string &header1="")
发送Http/Https响应
static std::string_view & get_value_header(const std::string_view &ori_str, std::string_view &str, const std::string &name)
从 HTTP 请求头中提取指定字段的值。
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 字符串中指定字段的值或嵌套结构。
int hour
时
Definition: sttnet.h:528
long long convertToMsec()
将当前时间间隔转换为总毫秒数。
Definition: sttnet.h:758
int connectionTimeout
Definition: sttnet.h:2552
void setFunction(std::function< bool(const int &fd)> fc)
设置epoll触发后的处理函数 注册一个回调函数
Definition: sttnet.h:2148
udp客户端的操作类
Definition: sttnet.h:3060
static int & toInt(const std::string_view &ori_str, int &result, const int &i=-1)
string转化为int类型
static std::string createJson(T1 first, T2 second)
创建仅包含一个键值对的 JSON 字符串。
Definition: sttnet.h:1614
保存Tcp客户端信息的结构体
Definition: sttnet.h:2460
static std::string jsonAdd(const std::string &a, const std::string &b)
将两个 JSON 字符串拼接为一个有效的 JSON(适用于对象或数组拼接)。
static bool compareTime(const std::string &time1, const std::string &time2, const std::string &format1=ISO8086A, const std::string &format2=ISO8086A)
比较两个时间字符串表示的时间的大小
security::ConnectionLimiter connectionLimiter
Definition: sttnet.h:2534
bool closeFile(const bool &del=false)
关闭已打开了的文件
bool appendLine(const std::string &data, const int &linePos=0)
插入行
std::string ip
客户端ip
Definition: sttnet.h:2469
bool isOpen()
获取对象是否打开日志文件的状态
Definition: sttnet.h:951
void setHBTimeOutTime(const int &secb)
设置发送心跳后的等待时间
Definition: sttnet.h:2841
日志文件操作类
Definition: sttnet.h:932
读写磁盘文件的类
Definition: sttnet.h:136
int msec
毫秒
Definition: sttnet.h:540
std::mutex lco1
Definition: sttnet.h:2544
随机数,字符串生成相关
Definition: sttnet.h:1115
int find(const std::string &targetString, const int linePos=1)
查找行
bool setFunction(std::function< bool(const HttpRequestInformation &inf, HttpServerFDHandler &k)> fc)
设置一个收到Http/Https请求并成功解析后进行响应的回调函数 注册一个回调函数
Definition: sttnet.h:2703
static char & bitOutput_bit(char input, const int pos, char &result)
获取字符 input 的从左向右第 pos 位(二进制)并返回 '1' 或 '0'。
bool endListen()
结束epoll监听 会阻塞直到epoll退出完成
void unblockSet()
设置对象中的套接字为非阻塞模式
SSL * ssl
如果加密了,存放加密句柄
Definition: sttnet.h:2489
bool isListen()
返回对象的监听状态
Definition: sttnet.h:2653
bool setFunction(std::function< bool(TcpFDHandler &k, TcpFDInf &inf)> fc)
设置收到客户端消息后的回调函数 注册一个回调函数
Definition: sttnet.h:2628
bool multiUseSet()
设置对象中的套接字为SO_REUSEADDR模式
char name[MAX_PROCESS_NAME]
进程名字
Definition: sttnet.h:3283
static bool startProcess(const std::string &name, const int &sec=-1, Args...args)
启动一个新进程(可选择是否定时重启)
Definition: sttnet.h:3379
SSL * getSSL(const int &fd)
查询和服务端的连接,传入套接字,返回加密的SSL句柄
void unblockSet()
设置为非阻塞模式
static std::string & getTime(std::string &timeStr, const std::string &format=ISO8086A)
获取当前时间
#define ISO8086A
定义ISO8086A这个宏为"yyyy-mm-ddThh:mi:ss"
Definition: sttnet.h:821
void setTimeOutTime(const int &seca)
设置心跳时间
Definition: sttnet.h:2835
void setFunction(std::function< bool(const std::string &message, WebSocketClient &k)> fc)
设置收到服务端消息后的回调函数 注册一个回调函数
Definition: sttnet.h:2231
void clearIP(const std::string &ip)
把记录某ip的连接数清零