协议分析器最终设计版本

类图:


内容用的不少,最终没有继续使用指针赋值的方法,而是牺牲了一点效率规规矩矩地设计了一系列类,利用了多态。 在性能与设计的取舍上,
我偏向于设计多一点,这个具体情况具体分析好了……

在最终的调用上就有了很大的简化:
 
void Packet::analyzePacket(const Byte *packet)
{
EtherHeader *ethHeader =NULL;
IPHeader *ipHeader =NULL;
Header *header =EtherHeader::getInstance(packet);
protoName =header->getNextProtocolName();

ethHeader =dynamic_cast<EtherHeader*>(header);
if(ethHeader) {
dstAddr =ethHeader->getDstMACAddrAsString();
srcAddr =ethHeader->getSrcMACAddrAsString();
}else {
Exception e("Type cast failed while trying type EtherHeader*");
throw e;
}

header =header->getNextHeader();
while(header) {
if((ipHeader =dynamic_cast<IPHeader*>(header)) !=NULL) {
dstAddr =ipHeader->getDstAddrAsString();
srcAddr =ipHeader->getSrcAddrAsString();
}
protoName =header->getNextProtocolName();
header =header->getNextHeader();
}
}

这样调用的代码就相对清爽了许多,而且不会产生过多的解析实例。调用代码同时考虑了协议报头的个性(最终显示出来的源目的地址,如果有IP协议则应显示IP地址,如只有MAC地址则显示MAC地址)和共性(都是分析出下一个协议名,同时获得下一个协议头的指针)。

posted @ 2012-04-05 12:08  Ethan.Tang  阅读(306)  评论(0编辑  收藏  举报