常用接口函数(记录作为编码工具)

/*

关键字:

作用: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);
}

记录常用函数,用于以后的开发使用,不断丰富!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值