这是快速背景:我有一个客户端和一个服务器程序通过Unix套接字相互通信.在服务器端解析收到的消息时,我试图使用strncmp来确定要采取的操作.
我遇到的问题是确切地确定用于strncmp的长度参数的内容.这是有问题的原因是我的一些消息共享一个共同的前缀.例如,我有一条消息“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的长度参数传递,但这似乎打败了使用strncmp的目的,即在意外输入的情况下防止溢出.我确实有一个静态变量用于我可以读取的最大消息长度,但它似乎传递了这个,因为长度只是确保如果消息溢出,效果最小化.
我想出了一些解决方案,但它们不是很漂亮,所以我想知道是否有一种解决这个问题的常用方法.
作为参考,我目前的解决方案是:
以这样的方式命令我的if / else if语句,以便按照长度递减的顺序检查具有公共前缀的任何消息(对于任何试图在以后添加内容的人来说,这似乎是在我的代码中抛出地雷的一种非常好的方法).
将我的消息与公共前缀组合在一起并首先查找后缀:
if(strncmp(message,strlen("getPrimary"))==0){ if(strncmp(message,strlen("getPrimaryStatus"))==0){ return bar; else return foo; } }
但这只是感觉很乱,特别是因为我有大约20种不同的可能消息,我正在处理.
创建一个包含所有可能消息的数组,向我的init序列添加一个函数,该函数将按降序长度对数组进行排序,并让我的代码搜索该列表的元素,直到找到匹配为止.这看似复杂而愚蠢.
看起来这应该是一个普遍的问题,应该在某个地方找到解决方案,但到目前为止我还没有找到任何东西.
在此先感谢您的帮助!
解决方法
假设消息中的字符串应该是以null结尾的,那么在这里使用strncmp()而不是strcmp()的唯一原因是在消息不为null的情况下防止它超出消息的结尾.封端的.
因此,传递给strncmp()的n应该是消息的接收大小,您应该知道(从读取消息的read()/ recv()函数的返回值).