typedef 与 set_new_handler的几种写法

本文探讨了如何利用Command模式及函数对象替代传统的函数指针应用方式, 并介绍了这样做的三大好处:数据封装、多态性以及与类层次结构结合的能力。通过这些改进, 可以更有效地管理和操作代码。

 

 

 

 

可以用Command模式、函数对象来代替函数指针,获得以下的好处:

1. 可以封装数据

2. 可以通过虚拟成员获得函数的多态性

3. 可以处理类层次结果,将Command与Prototype模式相结合,获得更多的便利。

 

转载于:https://www.cnblogs.com/charlesblc/p/6476872.html

#include "slp_model.h" #include "arp_scanner.h" #include "arpd_action.h" #include "arpd_dms.h" #include "dms_tool.h" LOCAL S32 dms_arpd_get(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj) { *rply_obj = jso_new_obj(); if (!*rply_obj) return SLP_ENOMEMORY; pthread_mutex_lock(&g_scanner.lock); // 序列化配置到JSON jso_add_bool(*rply_obj, "enabled", g_scanner.config.enabled); jso_add_int(*rply_obj, "scan_interval", g_scanner.config.scan_interval); jso_add_int(*rply_obj, "validity_period", g_scanner.config.validity_period); jso_add_int(*rply_obj, "packet_interval", g_scanner.config.packet_interval); jso_add_int(*rply_obj, "start_ip", g_scanner.config.start_ip); jso_add_int(*rply_obj, "end_ip", g_scanner.config.end_ip); jso_add_string(*rply_obj, "interface", g_scanner.config.interface); pthread_mutex_unlock(&g_scanner.lock); return SLP_OK; } LOCAL S32 dms_arpd_set(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj) { if (!req_obj) return SLP_EINVALRG; // 无效参数 pthread_mutex_lock(&g_scanner.lock); // 部分更新:只修改传入的字段 JSON_OBJPTR val; val = jso_obj_get(req_obj, "enabled"); if (val != NULL) { int bool_int = jso_get_int(val); g_scanner.config.enabled = (bool_int != 0); } val = jso_obj_get(req_obj, "scan_interval"); if (val != NULL) { g_scanner.config.scan_interval = jso_get_int(val); } val = jso_obj_get(req_obj, "validity_period"); if (val != NULL) { g_scanner.config.validity_period = jso_get_int(val); } val = jso_obj_get(req_obj, "packet_interval"); if (val != NULL) { g_scanner.config.packet_interval = jso_get_int(val); } val = jso_obj_get(req_obj, "start_ip"); if (val != NULL) { g_scanner.config.start_ip = jso_get_int(val); } val = jso_obj_get(req_obj, "end_ip"); if (val != NULL) { g_scanner.config.end_ip = jso_get_int(val); } val = jso_obj_get(req_obj, "interface"); if (val != NULL) { const char *iface = jso_get_string(val); strncpy(g_scanner.config.interface, iface, IFNAMSIZ - 1); g_scanner.config.interface[IFNAMSIZ - 1] = '\0'; } pthread_mutex_unlock(&g_scanner.lock); // 返回成功响应 *rply_obj = jso_new_obj(); if (*rply_obj) { jso_add_string(*rply_obj, "result", "success"); } return SLP_OK; } LOCAL S32 dms_arpd_start(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj) { // 创建响应JSON对象 *rply_obj = jso_new_obj(); if (*rply_obj == NULL) { DS_ERROR("Create response object failed"); return SLP_ENOMEM; // 返回内存不足错误码 } // 启动扫描 int start_result = arp_scanner_start(); if (start_result == OK) { jso_add_string(*rply_obj, "status", "success"); jso_add_string(*rply_obj, "message", "Scan started successfully"); // 添加扫描配置信息(加锁保证线程安全) pthread_mutex_lock(&g_scanner.lock); jso_add_bool(*rply_obj, "enabled", g_scanner.config.enabled); jso_add_int(*rply_obj, "scan_interval", g_scanner.config.scan_interval); jso_add_int(*rply_obj, "validity_period", g_scanner.config.validity_period); // 转换IP地址格式 char start_ip_str[MAX_IP_LEN], end_ip_str[MAX_IP_LEN]; int_to_ip(g_scanner.config.start_ip, start_ip_str); int_to_ip(g_scanner.config.end_ip, end_ip_str); jso_add_string(*rply_obj, "start_ip", start_ip_str); jso_add_string(*rply_obj, "end_ip", end_ip_str); jso_add_string(*rply_obj, "interface", g_scanner.config.interface); // 添加当前状态 jso_add_bool(*rply_obj, "is_scanning", g_scanner.scanning); jso_add_int(*rply_obj, "current_entry_count", g_scanner.entry_count); pthread_mutex_unlock(&g_scanner.lock); } else { jso_add_string(*rply_obj, "status", "error"); jso_add_int(*rply_obj, "error_code", start_result); // 根据错误码设置错误信息 const char *error_message = "Failed to start scan"; switch (start_result) { case ERROR_BUSY: error_message = "Scan already in progress"; break; case ERROR_DISABLED: error_message = "Scanner is disabled in configuration"; break; case ERROR_INVAL: error_message = "Invalid IP range in configuration"; break; case ERROR_SOCKET: error_message = "Failed to initialize network socket"; break; case ERROR_THREAD: error_message = "Failed to create scan thread"; break; } jso_add_string(*rply_obj, "message", error_message); } return start_result; } LOCAL S32 dms_arpd_stop(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj) { // 创建响应JSON对象 *rply_obj = jso_new_obj(); if (*rply_obj == NULL) { DS_ERROR("Create response object failed"); return SLP_ENOMEM; // 返回内存不足错误码 } // 获取当前扫描状态快照(加锁保证线程安全) pthread_mutex_lock(&g_scanner.lock); BOOL was_scanning = g_scanner.scanning; int entry_count = g_scanner.entry_count; time_t last_scan_time = g_scanner.last_scan_time; char interface_name[IFNAMSIZ]; strncpy(interface_name, g_scanner.config.interface, IFNAMSIZ - 1); interface_name[IFNAMSIZ - 1] = '\0'; // 确保字符串结束 pthread_mutex_unlock(&g_scanner.lock); // 停止扫描 int stop_result = arp_scanner_stop(); // 填充响应信息 jso_add_string(*rply_obj, "status", (stop_result == OK) ? "success" : "error"); jso_add_int(*rply_obj, "error_code", stop_result); if (stop_result == OK) { jso_add_string(*rply_obj, "action", was_scanning ? "Scan stopped" : "No active scan to stop"); } else { // 根据错误码设置错误信息 const char *error_message = "Failed to stop scan"; switch (stop_result) { case ERROR_NOT_RUNNING: error_message = "Scanner not running"; break; case ERROR_TIMEOUT: error_message = "Stop operation timed out, forced cancellation"; break; case ERROR_THREAD: error_message = "Thread operation failed"; break; } jso_add_string(*rply_obj, "message", error_message); } // 添加扫描结果统计 jso_add_bool(*rply_obj, "was_scanning", was_scanning); jso_add_int(*rply_obj, "entry_count", entry_count); // 添加时间信息 char last_scan_str[32]; if (last_scan_time > 0) { myformat_timestamp(last_scan_time, last_scan_str); jso_add_string(*rply_obj, "last_scan_time", last_scan_str); } else { jso_add_string(*rply_obj, "last_scan_time", "Never scanned"); } // 添加网络接口信息 jso_add_string(*rply_obj, "interface", interface_name); return stop_result; } LOCAL S32 dms_arpd_status(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj) { // 创建响应JSON对象 *rply_obj = jso_new_obj(); if (*rply_obj == NULL) { return SLP_ENOMEMORY; // 内存不足错误 } pthread_mutex_lock(&g_scanner.lock); // 添加扫描器状态信息到JSON对象 jso_add_bool(*rply_obj, "enabled", g_scanner.config.enabled); jso_add_bool(*rply_obj, "scanning", g_scanner.scanning); jso_add_int(*rply_obj, "entry_count", g_scanner.entry_count); // 格式化并添加时间信息 char last_scan_str[32] = "never scan"; if (g_scanner.last_scan_time > 0) { struct tm *tm_info = localtime(&g_scanner.last_scan_time); if (tm_info) { strftime(last_scan_str, sizeof(last_scan_str), "%Y-%m-%d %H:%M:%S", tm_info); } } jso_add_string(*rply_obj, "last_scan_time", last_scan_str); pthread_mutex_unlock(&g_scanner.lock); return 0; } LOCAL S32 dms_arpd_result(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj) { // 创建主响应对象 *rply_obj = jso_new_obj(); if (*rply_obj == NULL) { return SLP_ENOMEMORY; } pthread_mutex_lock(&g_scanner.lock); // 创建结果数组 JSON_OBJPTR entries_array = jso_new_array(); if (!entries_array) { pthread_mutex_unlock(&g_scanner.lock); return SLP_ENOMEMORY; } // 处理每个条目 for (int i = 0; i < g_scanner.entry_count; i++) { JSON_OBJPTR entry_obj = jso_new_obj(); if (!entry_obj) continue; char ip_str[MAX_IP_LEN]; char first_seen_str[32]; char last_seen_str[32]; // 转换IP地址 int_to_ip(g_scanner.entries[i].ip, ip_str); // 格式化时间戳 myformat_timestamp(g_scanner.entries[i].first_seen, first_seen_str); myformat_timestamp(g_scanner.entries[i].last_seen, last_seen_str); // 添加条目属性 jso_add_string(entry_obj, "ip_address", ip_str); jso_add_string(entry_obj, "mac_address", g_scanner.entries[i].mac); jso_add_string(entry_obj, "first_seen", first_seen_str); jso_add_string(entry_obj, "last_seen", last_seen_str); // 添加条目到数组 jso_array_add(entries_array, entry_obj); } // 添加结果数组到主对象 jso_obj_add(*rply_obj, "entries", entries_array); // 添加统计信息 jso_add_int(*rply_obj, "total_entries", g_scanner.entry_count); // 格式化最后扫描时间 char last_scan_str[32] = "never scan"; if (g_scanner.last_scan_time > 0) { struct tm *tm_info = localtime(&g_scanner.last_scan_time); if (tm_info) { strftime(last_scan_str, sizeof(last_scan_str), "%Y-%m-%d %H:%M:%S", tm_info); } } jso_add_string(*rply_obj, "last_scan_time", last_scan_str); pthread_mutex_unlock(&g_scanner.lock); return 0; } LOCAL S32 dms_arpd_clear(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj) { pthread_mutex_lock(&g_scanner.lock); // 重置条目计数 g_scanner.entry_count = 0; // 可选:重置扫描时间 g_scanner.last_scan_time = 0; pthread_mutex_unlock(&g_scanner.lock); return 0; } /* ---------- DMS ubus 方法的注册 ------------ */ /* 注册ubus具体方法 */ LOCAL DMS_CMD_METHOD arpd_cmd_method[] = { DMS_CMD_METHOD_DESC("get_conf", dms_arpd_get), DMS_CMD_METHOD_DESC("set_conf", dms_arpd_set), DMS_CMD_METHOD_DESC("start_scan", dms_arpd_start), DMS_CMD_METHOD_DESC("stop_scan", dms_arpd_stop), DMS_CMD_METHOD_DESC("get_scan_status", dms_arpd_status), DMS_CMD_METHOD_DESC("get_scan_result", dms_arpd_result), DMS_CMD_METHOD_DESC("clear_result", dms_arpd_clear), }; LOCAL DMS_CMD_OBJ_CMD arpd_cmd[] = { DMS_CMD_OBJ_CMD_DESC("arpd", arpd_cmd_method), }; /* 注册ubus模块 */ LOCAL DMS_CMD_OBJ arpd_call_obj = DMS_CMD_OBJ_DESC("arpd", arpd_cmd); LOCAL int arpd_cmd_call_handle(dms_handler_t *handler, U8 *mbuf, U32 mlen, U32 sender_dms_id) { return dms_cmd_msg_parse(handler, mbuf, mlen, sender_dms_id, &arpd_call_obj); } /* ---------- 模块的注册基础函数 ------------ */ LOCAL S32 arpdmod_stop() { /* 停止扫描 */ int stop_resultt = arp_scanner_stop(); /* 取消注册的DS方法 */ // ds_unregister_get_json("arpd_config", "arpd_info", "arpd_info", get_arpd_info); // ds_unregister_set_json("arpd_config", "arpd_info", "arpd_info", set_arpd_info); ds_unregister_action("arpd", "start_scan", arpd_start_scan); ds_unregister_action("arpd", "stop_scan", arpd_stop_scan); ds_unregister_action("arpd", "get_scan_status", arpd_get_scan_status); ds_unregister_action("arpd", "get_scan_result", arpd_get_scan_result); ds_unregister_action("arpd", "clear_result", arpd_clear_result); /* 取消注册的dms ubus调试方法 */ msg_detach_handler(MSGID_DMS_CMD, arpd_cmd_call_handle); return OK; } LOCAL S32 arpdmod_start() { int start_result = arp_scanner_start(); if (start_result == 0) { return OK; } else { return -1; } } LOCAL S32 arpdmod_reload() { return OK; } LOCAL S32 arpdmod_check() { return OK; } LOCAL S32 arpdmod_init() { /* ------- DS TDCP接口 ---------- */ /* 可以复写get/set json函数 */ // ds_register_get_json("arpd_config", "arpd_info", "arpd_info", get_arpd_info); // ds_register_set_json("arpd_config", "arpd_info", "arpd_info", set_arpd_info); /* 注册do方法函数 */ ds_register_action("arpd", "start_scan", arpd_start_scan); ds_register_action("arpd", "stop_scan", arpd_stop_scan); ds_register_action("arpd", "get_scan_status", arpd_get_scan_status); ds_register_action("arpd", "get_scan_result", arpd_get_scan_result); ds_register_action("arpd", "clear_result", arpd_clear_result); /* ------- DMS ubus接口 ---------- */ /* 注册ubus call调试方法 */ msg_attach_handler(MSGID_DMS_CMD, arpd_cmd_call_handle); return OK; } LOCAL void arpd_main() { /* 声明基础函数 */ DS_MOD_DESC arpd_module = DS_STRUCT_MOD("arpdmod", arpdmod_init, NULL, NULL, arpdmod_start, arpdmod_stop, NULL, NULL); /* 向ds注册模块 */ MODULE *module_node = ds_register_module("arpdmod", &arpd_module); NSD_ASSERT(NULL != module_node); } NSD_INIT(arpd_main);typedef struct _DMS_CMD_METHOD { const char *name; S32 (*handle)(JSON_OBJPTR req_obj, JSON_OBJPTR* rply_obj); } DMS_CMD_METHOD;为什么会报上面的错
最新发布
08-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值