evio/vendor/github.com/kavu/go_reuseport
Josh Baker cf82b88f7c SO_REUSEPORT
Just add "reuseport=true" to an address:

evio.Serve(events, "tcp://0.0.0.0:1234?reuseport=true")
2018-03-19 12:47:53 -07:00
..
LICENSE SO_REUSEPORT 2018-03-19 12:47:53 -07:00
Makefile SO_REUSEPORT 2018-03-19 12:47:53 -07:00
README.md SO_REUSEPORT 2018-03-19 12:47:53 -07:00
reuseport.go SO_REUSEPORT 2018-03-19 12:47:53 -07:00
reuseport_bsd.go SO_REUSEPORT 2018-03-19 12:47:53 -07:00
reuseport_linux.go SO_REUSEPORT 2018-03-19 12:47:53 -07:00
reuseport_windows.go SO_REUSEPORT 2018-03-19 12:47:53 -07:00
tcp.go SO_REUSEPORT 2018-03-19 12:47:53 -07:00
tcp_test.go SO_REUSEPORT 2018-03-19 12:47:53 -07:00
test.bash SO_REUSEPORT 2018-03-19 12:47:53 -07:00
udp.go SO_REUSEPORT 2018-03-19 12:47:53 -07:00
udp_test.go SO_REUSEPORT 2018-03-19 12:47:53 -07:00

README.md

GO_REUSEPORT

Build Status codecov GoDoc

GO_REUSEPORT is a little expirement to create a net.Listener that supports SO_REUSEPORT socket option.

For now, Darwin and Linux (from 3.9) systems are supported. I'll be pleased if you'll test other systems and tell me the results. documentation on godoc.org.

Example

package main

import (
  "fmt"
  "html"
  "net/http"
  "os"
  "runtime"
  "github.com/kavu/go_reuseport"
)

func main() {
  listener, err := reuseport.Listen("tcp", "localhost:8881")
  if err != nil {
    panic(err)
  }
  defer listener.Close()

  server := &http.Server{}
  http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Println(os.Getgid())
    fmt.Fprintf(w, "Hello, %q\n", html.EscapeString(r.URL.Path))
  })

  panic(server.Serve(listener))
}

Now you can run several instances of this tiny server without Address already in use errors.

Thanks

Inspired by Artur Siekielski post about SO_REUSEPORT.