背景简介:我有一个客户端和一个服务器程序,它们通过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,"getPrimary",strlen("getPrimary"))==0){
if(strncmp(message,"getPrimaryStatus",strlen("getPrimaryStatus"))==0){
return bar;
else
return foo;
}
}
但这种方式感觉很混乱,特别是我有大约20个不同的可能消息需要处理。
创建一个包含我所有可能消息的数组,在我的初始化序列中添加一个函数来按降序排序数组,并让我的代码在该列表的元素中查找直到找到匹配项。这似乎很复杂和愚蠢。
看起来这应该是一个常见的问题,应该有解决方案,但我到目前为止还没有找到任何有用的信息。
提前谢谢您的帮助!