快速背景介绍:我有一个客户端程序和一个服务器程序,它们通过Unix套接字相互通信。在服务器端解析接收到的消息时,我尝试使用strncmp找出要采取的措施。

我遇到的问题是弄清楚strncmp的length参数要使用什么。这是有问题的原因是我的某些消息共享一个公共(public)前缀。例如,我有一条消息“getPrimary”(使服务器以主服务器地址响应)和一条消息“getPrimaryStatus”(使服务器以主服务器状态响应)。我最初的想法是执行以下操作:

if(strncmp(message,"getPrimary",strlen("getPrimary"))==0){
    return foo;
}
else if(strncmp(message,"getPrimaryStatus",strlen("getPrimaryStatus"))==0){
    return bar;
}

问题是当我发送服务器“getPrimaryStatus”时,代码将始终返回foo,因为strncmp对字符串的检查不够。我可以将strlen(message)作为strncmp的length参数传递,但这似乎违背了使用strncmp的目的,即防止意外输入时发生溢出。我确实有一个可以读取的最大消息长度的静态变量,但是好像传入了该消息,因为该长度仅确保消息溢出时的影响最小。

我已经提出了一些解决方案,但是它们不是很漂亮,所以我想知道是否存在解决该问题的通用方法。

供引用,我目前的解决方案是:
对我的if/else if语句进行排序,以便以降序检查所有具有公共(public)前缀的消息(对于以后尝试向其中添加内容的人来说,这似乎是一种在我的代码中抛出地雷的好方法。 )。

将具有常见前缀的邮件分组在一起,然后先查找后缀:
if(strncmp(message,"getPrimary",strlen("getPrimary"))==0){
    if(strncmp(message,"getPrimaryStatus",strlen("getPrimaryStatus"))==0){
        return bar;
    else
        return foo;
    }
}

但这感觉很困惑,尤其是因为我正在处理大约20种可能的消息。

创建一个包含所有可能消息的数组,向初始化序列添加一个函数,该函数将按降序对数组进行排序,并让我的代码搜索该列表中的元素,直到找到匹配项。这似乎很复杂而且很愚蠢。

看来这应该是一个足够普遍的问题,应该在某个地方找到解决方案,但是到目前为止我还没有找到任何东西。

先谢谢您的帮助!

最佳答案

假设message中的字符串应该以空值结尾,那么在此处使用strncmp()而不是strcmp()的唯一原因是要防止它在message的结尾之外查找,如果message并非以空值结尾。

这样,您传递给nstrncmp()应该是您应该知道的message的接收大小(从读取消息的read()/recv()函数的返回值开始)。

10-06 05:05