C if语句上的逻辑运算符或AND
问题描述:
该逻辑检测到所有内容并打印bad pkt detected
时出错。C if语句上的逻辑运算符或AND
if((buff[0] != 0x0a || buff[0] != 0x0e) && (len == 210))
{
printf("badpkt detected from %s\n", xpi);
} else {
if(mysend(ssl_sd ? ssl_sd[i] : NULL, sd[i], buff, len) <= 0) MULTI_SKIP_QUIT
}
逻辑是DENY所有长度为210的数据包。除非第一个字节是0x0A或0x0E。
此代码工作,但:
if((buff[0] != 0x0a) && (len == 210))
{
printf("badpkt detected from %s\n", xpi);
} else {
if(mysend(ssl_sd ? ssl_sd[i] : NULL, sd[i], buff, len) <= 0) MULTI_SKIP_QUIT
}
但我需要两个0x0a
和0x0e
是唯一允许使用的210长分组。
编辑
我在想什么,也许它的睡眠不足。
答
你需要这样的逻辑:
if(buff[0] != 0x0a && buff[0] != 0x0e && len == 210)
有了这个条件:
if((buff[0] != 0x0a || buff[0] != 0x0e) && (len == 210))
想象buff[0]
是0x0e
。那么buff[0] != 0x0a
将是真实的,这使得整个子表达式(buff[0] != 0x0a || buff[0] != 0x0e)
为真。
你也可以反转条件:
if((buff[0] == 0x0a || buff[0] == 0x0e) //always allow these
|| (len != 210)) //and allow anything thats not of length 210
{
if(mysend(ssl_sd ? ssl_sd[i] : NULL, sd[i], buff, len) <= 0)
MULTI_SKIP_QUIT
} else {
printf("badpkt detected from %s\n", xpi);
}
答
如果你想同时0x0a
和0x0e
允许的,你需要使用这个条件:
if((buff[0] == 0x0a || buff[0] == 0x0e) && (len == 210))
答
这(buff[0] != 0x0a || buff[0] != 0x0e)
总是真。
应该if(buff[0] != 0x0a && buff[0] != 0x0e && (len == 210))
哦,我在想什么。 – zikdaljin 2013-04-23 23:24:50
呵呵,休息一下吧! – Pol0nium 2013-04-23 23:28:26