mcuadros / go-syslog

Syslog server library for go.
http://godoc.org/gopkg.in/mcuadros/go-syslog.v2
MIT License
523 stars 143 forks source link

server: add generic listen function #54

Open joy4eg opened 6 years ago

joy4eg commented 6 years ago

Hey,

I guess it is nice to have a generic listen function because go1.11+ now has ListenConfig methods and it could be useful to setup some sockets options. For example:

func controlSetOpts(network, address string, c syscall.RawConn) (err error) {
    // Taken from /usr/include/asm-generic/socket.h
    const reuseport = 15
    return c.Control(func(fd uintptr) {
        // Try to set socket options ..
        if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1); err != nil {
            log.Printf("cannot set SO_REUSEADDR on fd [%d]: %s", fd, err)
        }
        if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, reuseport, 1); err != nil {
            log.Printf("cannot set SO_REUSEPORT on fd [%d]: %s", fd, err)
        }
    })
}
...

lc := &net.ListenConfig{Control: controlSetOpts}
if conn, err := lc.ListenPacket(context.Background(), "udp", "127.0.0.1:7788"); err != nil {
    return err
} else {
    err = syslog.ListenOn(conn)
}

Any comments are welcome!