快速背景介绍:我有一个客户端程序和一个服务器程序,它们通过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
并非以空值结尾。
这样,您传递给n
的strncmp()
应该是您应该知道的message
的接收大小(从读取消息的read()
/recv()
函数的返回值开始)。