程序常通过网络进行通信,有时某些通信端口会被防火墙阻止导致程通信异常,一般情况要关闭防火墙或配置白名单比较麻烦。每次启动通过cmd命令添加防火墙例外可能造成程序经常使用从而多次重复添加同一规则,或程序考到磁盘的不同位置还要重新添加例外规则等。楼主比较懒所以写个简单demo,先查询防火墙,如果白名单中没有目标程序则将其名称和路径添加到例外规则中,如果目标程序已经存在于防火墙例外规则中则直接返回防止重复添加。
代码如下:
#include "stdafx.h"
#include <iostream>
using namespace std;
bool FirewallSet(string dir, string name)
{
// chcp 437 这个命令把操作系统默认语言强制转换成英文显示,便于解析。
string filedir = dir;
string cmd = "chcp 437 && netsh advfirewall firewall show rule name =";//先查询程序是否在防火墙白名单中
cmd.append(name);
cmd += " verbose";
char PipeResult[1024] = { 0 };
char buffer[128] = { 0 };
// 通过管道调用命令
FILE *pPipe;
if (NULL == (pPipe = _popen(cmd.c_str(), "rt")))
{
printf("error!");
return false;
}
while (fgets(buffer, 128, pPipe))
{
strcat(PipeResult, buffer);
if (strstr(PipeResult, filedir.c_str()) != NULL)
{
_pclose(pPipe);
return true;
}
}
cmd = "chcp 437 && netsh advfirewall firewall add rule name =";
cmd += name;
cmd.append(" dir = in action = allow program = \"");//拼接所需传输的命令
cmd += filedir;
cmd.append("\"");
if (NULL == (pPipe = _popen(cmd.c_str(), "rt")))
{
printf("error!");
return false;
}
// 打印结果
printf("%s", PipeResult);
_pclose(pPipe);
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
bool flag = FirewallSet("C:\\windows\\test\\123.exe","123");//将C:\\windows\\test\\123.exe加入防火墙白名单,规则名为123
if (flag)
{
cout << "Firewall Set Successful !" << endl;
}
else
{
cout << "FAILED !" << endl;
}
system("pause");
return 0;
}
demo下载地址:https://download.csdn.net/download/wangx_x/11590112