1

我有大约 20 到 30 个函数,我必须在任何函数中调用 wsse_authenticate,并且这个 wsse_authenticate 函数根据我发送错误消息的值返回一个值,有什么办法可以改进这个代码,所以我只是在每个函数中调用函数 wsse_authenticate(soap) 并用一些更好的代码替换开关盒,我想让它更有效率,请给我一些输入

wsse_ret = (wsse_authenticate(soap));

if(wsse_ret)
{
    switch(wsse_ret)
    {
        case 1: onvif_fault(soap,"ter:NoSecuritytoken","ter:Failed_wsse_Aunthentication");

        case 2: onvif_fault(soap,"ter:InvalidUserName","ter:FailedAunthentication");

        case 3: onvif_fault(soap,"ter:InvalidPassword","ter:FailedAunthentication");

    }
}
4

2 回答 2

2

从上面的代码中,我看到您在所有情况下都调用了相同的函数,期望将“失败消息”作为参数传递给函数onvif_fault。而且在每个 case 语句之后也没有中断,这不会给你预期的结果。

使用break语句的说明: 假设ret值为1,那么这三种情况都会被执行,因为最后有break语句。这意味着onvif_fault将使用不同的参数调用三次,这是不期望的。

您的问题的解决方案 您可以使用 c 中的结构创建一个表,该表实际上包含故障列表。
这是你可以只用一行代码替换你的 Switch 语句。

例如:
typedef struct _fault_messages
{
char msg1[254];
字符 msg2[254];
} 故障消息;

fault_messages msg_table[3] = {  
                    {"ter:NoSecuritytoken", "ter:Failed_wsse_Aunthentication"},  
                    {"ter:error1", "ter:fault1"},  
                    {"ter:error2", "ter:fault2"}  

};

现在,您在上表中的故障信息已被映射。您可以如下所述优化您的代码:

wsse_ret = (wsse_authenticate(soap));  

if(wsse_ret)  
{  
    onvif_fault(soap, msg_table[wsse_ret-1].msg1, msg_table[wsse_ret-1].msg2);  
}
于 2013-01-09T08:38:47.210 回答
1

如果我理解正确 - 您的主要问题是您不想在 30 个函数集中的每个函数中重复安全检查代码:-) 如果是这种情况,您可以尝试使用这种模式:

#include <stdio.h>
#include <string.h>

int isUserPasswordValid(char * password) {
    return strcmp(password, "MyBigPassword") == 0;
}

#define callFunctionWithAuthentication(password, secPayload, execPayload) \
do {\
   if (!isUserPasswordValid(password)) {\
      secPayload\
   }\
   else {\
      execPayload\
   }\
} while(0);

int myTestFunction(int x) {
    return x;
}

int main(int argc,char* argv[]){

   // bad password - executes only authentication
   callFunctionWithAuthentication(
               "randomPassword",
               printf("oops - bad password - can't continue\n");,
               int a = myTestFunction(10); printf("function returned %d\n",a);)

   // good password - executes authentication AND code after
   callFunctionWithAuthentication(
               "MyBigPassword",
               printf("oops - bad password - can't continue\n");,
               int a = myTestFunction(10); printf("function returned %d\n",a);)

   return 0;
}

唯一的缺点是您必须将每个 30 个函数的调用替换为callFunctionWithAuthentication. 但这是一次性的任务。此外,您必须始终调用此宏而不是plain函数。

于 2013-01-09T10:05:19.107 回答