zoukankan      html  css  js  c++  java
  • 协议分析器最终设计版本

    类图:


    内容用的不少,最终没有继续使用指针赋值的方法,而是牺牲了一点效率规规矩矩地设计了一系列类,利用了多态。 在性能与设计的取舍上,
    我偏向于设计多一点,这个具体情况具体分析好了……
    
    
    在最终的调用上就有了很大的简化:
     
    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地址)和共性(都是分析出下一个协议名,同时获得下一个协议头的指针)。

  • 相关阅读:
    C#---将数据库数据转换为json格式
    ASP.NET ---根据值让树中某一节点选中
    SQL---查询树中某个节点及其所有子节点
    CSS---相对定位笔记
    CSS---绝对定位笔记
    滑雪
    Self Numbers
    Lotto
    Parencodings
    Robot Motion
  • 原文地址:https://www.cnblogs.com/qianyuming/p/2432935.html
Copyright © 2011-2022 走看看