虽然在进行重构时,我已经以某种方式搞砸了我的代码,因此我使用的std :: map停止了正常工作。
我正在重新组装碎片化的IPv4数据包。
部分解析ValueError: Series lengths must match to compare
来了,如果它的数据包片段变成Packet
,它具有重组的功能。
Fragment
使用的数据类型:
...
if(packet.isIPv4() && packet.isFragment()){
auto keyForMap = packet.key();
auto it = fragments.find(keyForMap);
auto fragmentNotFound = fragments.end();
std::cout << "-----------------------" << std::endl;
std::cout << "Fragments len: " << fragments.size() << std::endl;
keyForMap.print();
if(it == fragmentNotFound){
std::cout << "Not Found" << std::endl;
fragments[keyForMap] = Fragment(packet);
} else {
std::cout << "Found" << std::endl;
fragments[keyForMap].add(packet);
/* reassembling function call and some processing */
}
}
}
...
为IPv4
std::array<uchar_t, 4>
是fragments
fragments_t &
是fragments_t
std::map<FragmentCommon, Fragment>
这是我的代码给我的输出:
struct FragmentCommon{
FragmentCommon(IPv4 ipsrc,
IPv4 ipdst,
uchar_t protocol,
uint16_t identification) : ip_src(ipsrc),
ip_dst(ipdst),
protocol(protocol),
identification(identification){};
void print(){
printf("key>%d.%d.%d.%d ", ip_src[0], ip_src[1], ip_src[2], ip_src[3]);
printf("%d.%d.%d.%d ", ip_dst[0], ip_dst[1], ip_dst[2], ip_dst[3]);
printf("%d %d\n", protocol, identification);
};
IPv4 ip_src;
IPv4 ip_dst;
uchar_t protocol;
uint16_t identification;
};
static bool operator<(const struct FragmentCommon &lhs, const struct FragmentCommon &rhs){
return lhs.ip_dst < rhs.ip_dst &&
lhs.ip_src < rhs.ip_src &&
lhs.protocol < rhs.protocol &&
lhs.identification < rhs.identification;
}
答案 0 :(得分:2)
鉴于您发布并在问题中说明的内容,因为IPv4
是std::array<uchar_t,4>
(我假设uchar_t
是unsigned char
的别名),您可以使用std::tie为operator <
定义FragmentCommon
。
在处理多个值以进行测试时,使用std::tie
更容易定义严格弱排序(std::map
键所需)更容易出错“层叠”的时尚。
#include <tuple>
//...
static bool operator < (const struct FragmentCommon &lhs, const struct FragmentCommon &rhs)
{
return std::tie(lhs.ip_dst, lhs.ip_src, lhs.protocol, lhs.identification) <
std::tie(rhs.ip_dst, rhs.ip_src, rhs.protocol, rhs.identification);
}
自定义std::array has operator <以来,在std::tie
中使用所有4个参数时,使用std::tie
正常工作。