只是一个简单的计网课设
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
eruhs/describer/ipv4.go

61 lines
1.9 KiB

package describer
import (
"encoding/hex"
"eruhs/core/parser"
"fmt"
)
type IPv4Describer struct {
IPv4 *parser.IPv4
}
func (i *IPv4Describer) GetHeader() []byte {
return i.IPv4.Header
}
func (i *IPv4Describer) GetDetailDescribe() Describe {
optionDescribe := make([]map[string]string, 0)
for _, option := range i.IPv4.Options {
optionDescribe = append(optionDescribe, map[string]string{
"类型": fmt.Sprintf("%d", option.OptionType),
"长度": fmt.Sprintf("%d", option.OptionLength),
"数据": hex.EncodeToString(option.OptionData),
})
}
protoName := ""
switch i.IPv4.Protocol {
case parser.IPv4ProtoICMP:
protoName = "ICMP"
case parser.IPv4ProtoIGMP:
protoName = "IGMP"
case parser.IPv4ProtoTCP:
protoName = "TCP"
case parser.IPv4ProtoUDP:
protoName = "UDP"
case parser.IPv4ProtoENCAP:
protoName = "ENCAP"
case parser.IPv4ProtoOSPF:
protoName = "OSPF"
case parser.IPv4ProtoSCTP:
protoName = "SCTP"
}
return Describe{
1: {"版本", fmt.Sprintf("%d", i.IPv4.Version)},
2: {"首部长度", fmt.Sprintf("%d", i.IPv4.IHL)},
3: {"区分服务", fmt.Sprintf("%d", i.IPv4.DS)},
4: {"总长", fmt.Sprintf("%d", i.IPv4.TotalLength)},
5: {"标识符", fmt.Sprintf("%d", i.IPv4.Id)},
6: {"标志", fmt.Sprintf("%d", i.IPv4.Flags)},
7: {"分片偏移", fmt.Sprintf("%d", i.IPv4.FragOffset)},
8: {"存活时间", fmt.Sprintf("%d", i.IPv4.TTL)},
9: {"应用层协议", protoName},
10: {"首部校验和", fmt.Sprintf("%d", i.IPv4.Checksum)},
11: {"源地址", i.IPv4.SrcIP.String()},
12: {"目的地址", i.IPv4.DstIP.String()},
13: {"选项字段", fmt.Sprintf("%+v", optionDescribe)},
14: {"填充", fmt.Sprintf("%d Byte", len(i.IPv4.Padding))},
}
}