c-router-emulator/router/router.c

281 lines
8.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "router.h"
#include "db.h"
#include "net_task_thread.h"
int main(int argc, char const *argv[])
{
// 初始化
net_init(); // 初始化网络和数据库
// 打开菜单
menu_choice();
// pthread_t thread_net_task;
// pthread_create(&thread_net_task, NULL, net_task, NULL);
// pthread_join(thread_net_task, NULL);
// close(sockfd); // 关闭原始套接字
close_mysql(); // 关闭数据库连接
// // 关闭网络设备
// pcap_close(device1);
// pcap_close(device2);
return 0;
}
void net_init()
{
// 创建原始套接字
// sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); // 参数列表:协议族、套接字类型、协议类型
// if (sockfd < 0)
// {
// perror("socket");
// exit(-1);
// }
// 数据连接测试
if (connect_mysql("localhost", 3306, "flykhan", "1202", "router") == 0)
printf("数据库连接成功\n");
else
printf("数据库连接错误\n");
}
// MySQL 测试
int is_blocked_ip(unsigned char *ip)
{
char sql[1024] = "";
sprintf(sql, "select * from ip_fw where ip = '%s'", ip);
int rows = result_rows(sql);
printf("打印 %s\n", sql);
printf("rows: %d\n", rows);
// execlp("iptables", "iptables", "-A", "FORWARD", "-s", ip, "-j", "DROP", NULL); // 将源IP地址加入防火墙
execlp("iptables", "iptables", "-D", "FORWARD", "-s", ip, "-j", "DROP", NULL); // 将源IP地址加入防火墙
// 获取行数
if (rows > 0)
{
printf("IP地址 %s 在黑名单中\n", ip);
// execlp("iptables", "iptables", "-A", "FORWARD", "-s", ip, "-j", "DROP", NULL); // 将源IP地址加入防火墙
// 从防火墙删除
execlp("iptables", "iptables", "-D", "FORWARD", "-s", ip, "-j", "DROP", NULL); // 将源IP地址加入防火墙
return 0;
}
else
{
printf("IP地址 %s 不在黑名单中\n", ip);
return -1;
}
}
void printResult(MYSQL_ROW row, char (*columns)[30], int cols)
{
// printf("printResult\n");
// printf("cols: %d\n", cols);
// printf("row: %s\n", row[0]);
// printf("%s\n", columns[0]);
for (int i = 0; i < cols; i++)
{
printf("%s: %s \t", columns[i], row[i]);
}
printf("\n");
}
void show()
{
printf("**************************************************\n");
printf("** **\n");
printf("** 模拟路由后端管理系统 **\n");
printf("** **\n");
printf("** 1.添加黑名单IP **\n");
printf("** 2.显示所有黑名单 **\n");
printf("** 3.删除黑名单 **\n");
printf("** 4.开启路由器 **\n");
printf("** 5.刷新ARP表缓存 **\n");
printf("** 6.显示所有ARP表缓存 **\n");
printf("** 9.重新打印菜单 **\n");
printf("** 0.退出此系统 **\n");
printf("** **\n");
printf("**************************************************\n");
printf("********** 版权所有 FLY-NOOB **********\n");
printf("**************************************************\n");
}
// 判断IP地址格式是否正确
int is_ip_valid(const char *ip)
{
regex_t regex; // 正则表达式
int ret;
// 编译正则表达式
// /^((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$/
ret = regcomp(&regex, "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", REG_EXTENDED); // REG_EXTENDED 扩展正则表达式
if (ret != 0)
{
printf("regcomp error\n");
return -1;
}
// 执行正则表达式
ret = regexec(&regex, ip, 0, NULL, 0);
regfree(&regex); // 释放正则表达式
if (ret == 0)
{
printf("IP地址格式正确\n");
return 0;
}
else if (ret == REG_NOMATCH)
{
printf("IP地址格式非法\n");
return -1;
}
else
{
printf("正则表达式匹配错误\n");
return -1;
}
}
// 发送ARP请求方法
// 后台菜单
void menu_choice()
{
// 选择标志位
int choice = 0;
show(); // 打印菜单
int pthread_flag = 0;
while (1)
{
printf("请输入你的选择: \n");
scanf("%d", &choice);
getchar(); // 清空缓冲区
// 后端添加黑名单 ip
if (1 == choice)
{
char add_blacked_ip[INET_ADDRSTRLEN] = "";
printf("请输入要添加的黑名单IP格式如 192.168.6.5\n");
fgets(add_blacked_ip, sizeof(add_blacked_ip), stdin);
add_blacked_ip[strlen(add_blacked_ip) - 1] = '\0'; // 将最后的换行符替换为字符串结束符
printf("add_blacked_ip: %s\n", add_blacked_ip);
// IP 格式检查
if (is_ip_valid(add_blacked_ip) != 0)
{
printf("IP地址格式错误\n");
continue;
}
// 将IP地址加入黑名单
MYSQL_BIND parmas[1];
parmas[0].buffer_type = MYSQL_TYPE_STRING;
parmas[0].buffer = add_blacked_ip;
parmas[0].buffer_length = strlen(add_blacked_ip);
parmas[0].is_null = 0;
parmas[0].length = &parmas[0].buffer_length;
const char *insert_ip_fw_sql = "insert into ip_fw(ip) values(?)";
int result = insert(insert_ip_fw_sql, parmas);
if (result > 0)
{
printf("黑名单添加成功\n");
}
else
{
printf("黑名单添加失败\n");
}
}
// 后端查询黑名单 ip
else if (2 == choice)
{
printf("黑名单列表如下:\n");
const char *select_ip_fw_sql = "select * from ip_fw";
query(select_ip_fw_sql, printResult);
}
// 后端删除黑名单 ip
else if (3 == choice)
{
char delete_blacked_ip[INET_ADDRSTRLEN] = "";
printf("请输入要删除的黑名单IP格式如 192.168.6.5\n");
fgets(delete_blacked_ip, sizeof(delete_blacked_ip), stdin);
delete_blacked_ip[strlen(delete_blacked_ip) - 1] = '\0'; // 将最后的换行符替换为字符串结束符
printf("delete_blacked_ip: %s\n", delete_blacked_ip);
// IP 格式检查
if (is_ip_valid(delete_blacked_ip) != 0)
{
printf("IP地址格式错误\n");
continue;
}
// 将IP地址从黑名单中删除
MYSQL_BIND parmas[1];
parmas[0].buffer_type = MYSQL_TYPE_STRING;
parmas[0].buffer = delete_blacked_ip;
parmas[0].buffer_length = strlen(delete_blacked_ip);
parmas[0].is_null = 0;
parmas[0].length = &parmas[0].buffer_length;
const char *delete_ip_fw_sql = "delete from ip_fw where ip = ?";
int result = delete (delete_ip_fw_sql, parmas);
if (result > 0)
{
printf("黑名单删除成功\n");
}
else
{
printf("黑名单删除失败\n");
}
}
else if (4 == choice)
{
if (0 == pthread_flag)
{
printf("开启路由器\n");
pthread_flag += 1; // 线程标志位修改
pthread_t thread_net_task;
pthread_create(&thread_net_task, NULL, net_task, NULL);
pthread_detach(thread_net_task);
}
else
{
printf("路由器正在运行......\n");
}
}
else if (5 == choice)
{
}
// 显示 ARP 表
else if (6 == choice)
{
printf("ARP 表如下:\n");
const char *select_arp_result_sql = "select * from ip_mac";
query(select_arp_result_sql, printResult);
}
// 重新打印菜单
else if (9 == choice)
{
show();
}
// 退出此系统
else if (0 == choice)
{
printf("退出此系统\n");
return;
}
else
{
printf("输入错误,请重新输入\n");
}
}
}