第三次寒假作业 #1

第三次寒假作业 #1

优化第二次作业

在解决结果和答案不一致的时候,我发现了一个大问题:

以出现在第11行的第一个错误点为例,

对应的规则集五元组是: @178.139.217.134/31 16.28.112.0/22 0 : 65535 1489 : 1489 0x06/0xFF

对应的数据集五元组是: 2995509639 270299136 0 1489 6

178.139.217.134经过二进制化是1011 0010 1000 1011 1101 1001 1000 0110,再经过十进制化是2,995,509,638,与数据集2995509639的不符!

经过助教的指点,发现是因为我在学习中遗漏了关于子网掩码的内容。我自认为数据和规则的IP严格一致才能成功匹配,但是事实是它们只需要在同一个子网就能进行匹配。

如此以来,我的答案中不再会出现返回-1的情况,正确答案数量从原来的8201上升到了9146——离9191还是有一定差距的。请允许我再去调试调试看看错误在哪。

贴出修改的几个部分:

//dataset				//数据集 
long long dipin,dipout;
long dptin,dptout;					//port端口 
int dptcl;						//protocol协议号 

利用全局变量而不是结构体来存储数据,这样可以节省很多的内存

long findrule()
{
	for(long k=0;k<i;k++)
		{
			if(abs(dipin-rl[k].ipin)<pow(2,32-rl[k].smin)&&abs(dipout-rl[k].ipout)<pow(2,32-rl[k].smout))
			{
				if(dptin<=rl[k].ptinup&&dptin>=rl[k].ptinlow&&dptout<=rl[k].ptoutup&&dptout>=rl[k].ptoutlow)
				{
					if(dptcl==rl[k].ptcll||rl[k].ptclmode==1)
					{
						return k;
					}
				}
			}
		}
	return -1;
}

添加了子网掩码的运算

不过后来发现这个部分是不符合规范的,所以最后还是有大概十几条答案是错误的。

	ifstream dfin("packet.txt");
	fstream fout("ans.txt");
	
	
	for(;!dfin.eof();)
	{
		dptcl=256;
		dfin>>dipin>>dipout>>dptin>>dptout>>dptcl;
		if(dptcl==256)
		{
			break;
		}
		else
		{
			fout<<findrule()<<endl;;
		}
	}

输入数据的部分也有改变

posted @ 2022-02-19 14:19  Knigh7_de_Ficusé  阅读(58)  评论(0编辑  收藏  举报