// setUDPRecvBuf is used to resize the UDP receive window. The function // attempts to set the read buffer to `udpRecvBuf` but backs off until // the read buffer can be set. func setUDPRecvBuf(c *net.UDPConn) { size := udpRecvBuf for { if err := c.SetReadBuffer(size); err == nil { break } size = size / 2 } }
func main() { listen := flag.String("addr", ":2055", "Listen address") flag.Parse() var addr *net.UDPAddr var err error if addr, err = net.ResolveUDPAddr("udp", *listen); err != nil { log.Fatal(err) } var server *net.UDPConn if server, err = net.ListenUDP("udp", addr); err != nil { log.Fatal(err) } if err = server.SetReadBuffer(readSize); err != nil { log.Fatal(err) } decoders := make(map[string]*netflow.Decoder) for { buf := make([]byte, 8192) var remote *net.UDPAddr var octets int if octets, remote, err = server.ReadFromUDP(buf); err != nil { log.Printf("error reading from %s: %v\n", remote, err) continue } log.Printf("received %d bytes from %s\n", octets, remote) d, found := decoders[remote.String()] if !found { s := session.New() d = netflow.NewDecoder(s) decoders[remote.String()] = d } m, err := d.Read(bytes.NewBuffer(buf[:octets])) if err != nil { log.Println("decoder error:", err) continue } switch p := m.(type) { case *netflow1.Packet: netflow1.Dump(p) case *netflow5.Packet: netflow5.Dump(p) case *netflow6.Packet: netflow6.Dump(p) case *netflow7.Packet: netflow7.Dump(p) case *netflow9.Packet: netflow9.Dump(p) case *ipfix.Message: ipfix.Dump(p) } } }