/*
关键字:
作用:C语言校验字符串中是否存在中文
参数一:字符串
*/
#include <stdio.h>
//返回0:无中文,返回1:有中文
int includeChinese(char *str)
{
char c;
while(1)
{
c=*str++;
if (c==0) break; //如果到字符串尾则说明该字符串没有中文字符
if (c&0x80) //如果字符高位为1且下一字符高位也是1则有中文字符
if (*str & 0x80) return 1;
}
return 0;
}
/*
关键字:popen
作用:获取命令的返回结果
参数一:命令cmd
参数二:执行cmd命令获取到的返回信息
*/
#defind MAXLEN 4096
void cmdSystem(const char* cmd, char* retVal)
{
FILE* stream = NULL;
char buf[MAXLEN] = "";
if( (stream = popen(cmd, "r")) != NULL)
{
fread(buf, sizeof(char), sizeof(buf), stream);
pclose(stream);
stream = NULL;
}
if (retVal != NULL)
{
sprintf(retVal, "%s", buf);
}
}
/*
关键字:切割字符串
作用:根据字符切割字符串
参数一:string字符串
参数二:单个字符
*/
vector<string> splitString(const string& str, const string& pattern)
{
vector<string> resVec;
if (str.empty())
return resVec;
//方便截取最后一段数据
string strs = str + pattern;
size_t pos = strs.find(pattern);
size_t size = strs.size();
while (pos != std::string::npos)
{
std::string x = strs.substr(0, pos);
resVec.push_back(x);
strs = strs.substr(pos + 1, size);
pos = strs.find(pattern);
}
return resVec;
}
/*
关键字:校验IP地址格式
作用:校验IP地址格式是否正确
参数一:ip地址
返回值:校验正确返回true,失败返回false
头文件:#include <regex>
适用环境:windows下
*/
bool isIpFormatRight(const string &ipAddress)
{
// 定义一个正则表达式 , 4~23 位数字和字母的组合
std::regex repPattern("(25[0-4]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])[.](25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])[.](25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])[.](25[0-4]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])", std::regex_constants::extended);
// 声明匹配结果变量
std::match_results<string::const_iterator> rerResult;
// 进行匹配
bool bValid = std::regex_match(ipAddress, rerResult, repPattern);
if (bValid)
{
// 匹配成功
return true;
}
return false;
}
/*
关键字:根据字符替换字符串
作用:根据字符替换字符串
参数一:要替换的字符串
参数二:字符串中要替换的字符
参数二:要替换成为的字符
返回值:返回替换后的字符串
头文件:#include <algorithm>
*/
string replaceStrByCh(string str, char srcCh, char dstCh)
{
std::replace(str.begin(), str.end(), srcCh, dstCh);
return str;
}
/*
关键字:替换字符串中的字符串
作用:替换字符串中的字符串
参数一:要替换的字符串
参数二:字符串中要替换的字符串
参数二:要替换成为的字符串
返回值:返回替换后的字符串
*/
string replaceStrByStr(string &srcStr, const string&srcValue, const string &dstValue)
{
for (string::size_type pos(0); pos != string::npos; pos += dstValue.length())
{
if ((pos = srcStr.find(srcValue, pos)) != string::npos)
srcStr.replace(pos, srcValue.length(), dstValue);
else
break;
}
return srcStr;
}
如:srcStr = "aaa::bbb::ccc" , srcValue = "::" ,dstValue = "->"; 完成之后srcStr = "aaa->bbb->ccc";
//string删除换行和空格
string retStr;
retStr.erase(remove(retStr.begin(), retStr.end(), '\n'), retStr.end());
retStr.erase(remove(retStr.begin(), retStr.end(), ' '), retStr.end());
/*
关键字:syslog日志
作用:写入syslog日志
参数一:字符串数据
*/
#define MAXLEN 1024
#define SYSLOG_FACILITY LOG_DAEMON
#define SYSLOG_LEVEL LOG_NOTICE
void Log(char* logentry, ...)
{
char logbuffer[MAXLEN];
va_list argsPtr;
va_start(argsPtr, logentry);
vsnprintf(logbuffer, MAXLEN, logentry, argsPtr);
va_end(argsPtr);
openlog("[SecurityMonitor]", LOG_PID, SYSLOG_FACILITY);
syslog(SYSLOG_LEVEL, "%s", logbuffer);
closelog();
}
/*
关键字:CreateProcess,CreatePipe获取命令执行结果
作用:通过管道方式获取执行的DOS命令的返回值,类似与popen操作
参数一:执行命令
参数二:命令返回结果
*/
int cmdSystem(const char* cmd, char *retVal)
{
CString str(cmd);
LPWSTR runcmd = (LPWSTR)(LPCWSTR)str;
//printf("%S\n", runcmd);
SECURITY_ATTRIBUTES sa;
HANDLE hRead, hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead, &hWrite, &sa, 0))
{
printf("error");
return RET_ERROR;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if (!CreateProcess(NULL, runcmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
{
printf("error");
return RET_ERROR;
}
CloseHandle(hWrite);
char buffer[128] = "";
char result[4096] = "";
DWORD bytesRead;
while (1)
{
if (ReadFile(hRead, buffer, 127, &bytesRead, NULL) == FALSE)
break;
strcat_s(result, buffer);
memset(buffer, 0, 128);
}
sprintf_s(retVal, sizeof(result), "%s", result);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return RET_OK;
}
/*检查文件是否存在*/
/****************************************************************
* function name : checkFileExist
* functional description : 检查文件是否存在
* input parameter :filename :文件名
* return value: 文件存在返回1;文件不存在返回0
*****************************************************************/
int checkFileExist(const char* filename)
{
if (access(filename, 0) == -1)
{
return 0;
}
return 1;
}
/****************************************************************
* function name : get_mac_addr
* functional description : 获取mac地址
* input parameter :mac:存放获取到的mac地址; len_limit:mac长度,这边大概是17左右
* return value: 返回实际写入的mac地址的长度(不包括'\0')
*****************************************************************/
#include <net/if.h>
#include <sys/ioctl.h>
int get_mac_addr(char* mac, int len_limit)
{
struct ifreq ifreq;
int sock;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket");
return -1;
}
strcpy(ifreq.ifr_name, "eth0"); //Currently, only get eth0
if (ioctl(sock, SIOCGIFHWADDR, &ifreq) < 0)
{
perror("ioctl");
return -1;
}
return snprintf(mac, len_limit, "%X:%X:%X:%X:%X:%X",
(unsigned char)ifreq.ifr_hwaddr.sa_data[0], (unsigned char)ifreq.ifr_hwaddr.sa_data[1],
(unsigned char)ifreq.ifr_hwaddr.sa_data[2], (unsigned char)ifreq.ifr_hwaddr.sa_data[3],
(unsigned char)ifreq.ifr_hwaddr.sa_data[4], (unsigned char)ifreq.ifr_hwaddr.sa_data[5]);
}
/****************************************************************
* function name : strlower
* functional description : 字符串转小写
* input parameter : str:字符串
* return value: None
*****************************************************************/
void strlower(char* str)
{
for (; *str != '\0'; str++)
{
*str = tolower(*str);
}
}
/****************************************************************
* function name : remove_line
* functional description : 删除字符串换行
* input parameter :str :字符串
* return value: None
*****************************************************************/
void remove_line(char* str)
{
char* readP = str;
char* writeP = str;
char temp;
do
{
temp = *(readP++);
if (temp != '\n')
* (writeP++) = temp;
} while (temp);
}
/****************************************************************
* function name : Log
* functional description : 日志记录
* input parameter : format:字符串格式
* return value: 失败返回0;成功返回正整数
*****************************************************************/
int Log(const char *log_file_name, const char* format, ...)
{
/*文件夹不存在,则不写入*/
if (access(LOGFILEDIR, 0) == -1)
{
return RET_ERROR;
}
FILE* pFile = fopen(log_file_name, "a");
va_list arg;
int done;
va_start(arg, format);
time_t time_log = time(NULL);
struct tm* tm_log = localtime(&time_log);
fprintf(pFile, "%04d-%02d-%02d %02d:%02d:%02d ", tm_log->tm_year + 1900, tm_log->tm_mon + 1, tm_log->tm_mday, tm_log->tm_hour, tm_log->tm_min, tm_log->tm_sec);
done = vfprintf(pFile, format, arg);
va_end(arg);
fflush(pFile);
fclose(pFile);
return done;
}
/****************************************************************
* function name : isIpFormatRight
* functional description : 校验IP地址格式
* input parameter :ipAddr:IP地址
* return value: IP地址格式正确返回1;格式错误返回0
*****************************************************************/
int isIpFormatRight(const char* ipAddr)
{
int ip_part_1 = 0;
int ip_part_2 = 0;
int ip_part_3 = 0;
int ip_part_4 = 0;
char end_char = 0;
if ((NULL == ipAddr) || (0 == strlen(ipAddr)))
{
return RET_ERROR;
}
if (4 == sscanf(ipAddr, "%d.%d.%d.%d%c", &ip_part_1, &ip_part_2, &ip_part_3, &ip_part_4, &end_char))
{
if ((ip_part_1 >= 0) && (ip_part_1 <= 255) &&
(ip_part_2 >= 0) && (ip_part_2 <= 255) &&
(ip_part_3 >= 0) && (ip_part_3 <= 255) &&
(ip_part_4 >= 0) && (ip_part_4 <= 255)
)
{
return RET_OK;
}
}
return RET_ERROR;
}
/****************************************************************
* function name : get_local_time
* functional description : 获取当前时间
* input parameter :local_time:存放时间字符串
* return value: None
*****************************************************************/
#include <stdio.h>
#include <time.h>
void get_local_time(char *local_time)
{
time_t nowtime;
struct tm* p;;
time(&nowtime);
p = localtime(&nowtime);
sprintf(local_time, "%04d-%02d-%02d %02d:%02d:%02d", p->tm_year+1900, p->tm_mon+1, p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
/*printf("%02d:%02d:%02d\n",p->tm_hour,p->tm_min,p->tm_sec);*/
}
/****************************************************************
* function name : getAttackIpAddress
* functional description : 获取IP地址的位置信息
* input parameter :attackalertAddress:地理位置;attackalertIp:攻击者IP
* return value: None
* 补充:无法单独使用,需要引入cJSON
*****************************************************************/
void getAttackIpAddress(char* attackalertAddress, char* attackalertIp)
{
if (strlen(attackalertIp) == 0) return;
char cmd[MIDLEN] = "";
char retVal[MIDLEN] = "";
sprintf(cmd, "curl --connect-timeout 10 http://ip-api.com/json/%s?lang=zh-CN", attackalertIp);
sprintf(retVal, "%s", cmdSystem(cmd));
remove_line(retVal);
cJSON* json = NULL;
json = cJSON_Parse(retVal);
if (json == NULL) return;
cJSON* node = NULL;
node = cJSON_GetObjectItem(json, "city");
if (node == NULL) return;
sprintf(retVal, "%s", node->valuestring);
sprintf(attackalertAddress, "%s", retVal);
}
记录常用函数,用于以后的开发使用,不断丰富!!!