MCPcopy
hub / github.com/monasticacademy/httptap / Main

Function Main

experiments/udp/udp-experiment.go:17–74  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

15)
16
17func Main() error {
18 var args struct {
19 Interface string `arg:"positional,required"`
20 Remote string `arg:"positional,required"`
21 Count int `default:"2"`
22 }
23 arg.MustParse(&args)
24
25 // packetsource, err := afpacket.NewTPacket(afpacket.OptInterface(args.Interface))
26 // if err != nil {
27 // return nil
28 // }
29
30 iface, err := net.InterfaceByName(args.Interface)
31 if err != nil {
32 return err
33 }
34
35 // packet.Raw means listen for raw IP packets (requires root permissions)
36 // unix.ETH_P_ALL means listen for all packets
37 conn, err := packet.Listen(iface, packet.Raw, unix.ETH_P_ALL, nil)
38 if err != nil {
39 if errors.Is(err, unix.EPERM) {
40 return fmt.Errorf("you need root permissions to read raw packets (%w)", err)
41 }
42 return fmt.Errorf("error listening for raw packet: %w", err)
43 }
44
45 // set promiscuous mode so that we see everything
46 err = conn.SetPromiscuous(true)
47 if err != nil {
48 return fmt.Errorf("error setting raw packet connection to promiscuous mode: %w", err)
49 }
50
51 // write a udp packet
52 udpconn, err := net.Dial("udp", args.Remote)
53 if err != nil {
54 return fmt.Errorf("error dialing %v: %w", args.Remote, err)
55 }
56 udpconn.Write([]byte("hello from udp-experiment..."))
57
58 // read a packet
59 buf := make([]byte, iface.MTU)
60 for i := 0; i < args.Count; i++ {
61 n, srcmac, err := conn.ReadFrom(buf)
62 if err != nil {
63 return fmt.Errorf("error reading raw packet: %w", err)
64 }
65 _ = srcmac
66
67 // decode with gopacket
68 log.Printf("read %d bytes", n)
69 packet := gopacket.NewPacket(buf[:n], layers.LayerTypeIPv4, gopacket.NoCopy)
70 log.Println(packet.Dump())
71 }
72
73 return nil
74}

Callers 1

mainFunction · 0.70

Calls 1

WriteMethod · 0.65

Tested by

no test coverage detected