我正在编写用于生成ICMP数据包的小代码。为此我遵循golang net package的代码。
我确定了以下用于ICMP数据包生成的代码:
109 c, err := Dial(tt.net, tt.raddr)
110 if err != nil {
111 t.Fatalf("Dial failed: %v", err)
112 }
113 c.SetDeadline(time.Now().Add(100 * time.Millisecond))
114 defer c.Close()
115
116 typ := icmpv4EchoRequest
117 if net == "ip6" {
118 typ = icmpv6EchoRequest
119 }
120 xid, xseq := os.Getpid()&0xffff, i+1
121 wb, err := (&icmpMessage{
122 Type: typ, Code: 0,
123 Body: &icmpEcho{
124 ID: xid, Seq: xseq,
125 Data: bytes.Repeat([]byte("Go Go Gadget Ping!!!"), 3),
126 },
127 }).Marshal()
128 if err != nil {
129 t.Fatalf("icmpMessage.Marshal failed: %v", err)
130 }
131 if _, err := c.Write(wb); err != nil {
132 t.Fatalf("Conn.Write failed: %v", err)
133 }
我无法理解此代码中的以下内容:
Marshal()
未包含在net package documentation中,请让我知道如何找到此功能以及为什么它不包含在网络包中。
请解释第121行(icmpMessage
结构和函数调用,因为这些未在此文件中定义)。
答案 0 :(得分:0)