第三次寒假作业 #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;;
}
}
输入数据的部分也有改变
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?