// +build windows package utils import ( "fmt" "net" "os" "strings" "syscall" "github.com/valyala/tcplisten" ) // CreateListener crates socket listener based on DSN definition. func CreateListener(address string) (net.Listener, error) { dsn := strings.Split(address, "://") switch len(dsn) { case 1: // assume, that there is no prefix here [127.0.0.1:8000] return createTCPListener(dsn[0]) case 2: // we got two part here, first part is the transport, second - address // [tcp://127.0.0.1:8000] OR [unix:///path/to/unix.socket] OR [error://path] // where error is wrong transport name switch dsn[0] { case "unix": // check of file exist. If exist, unlink if fileExists(dsn[1]) { err := syscall.Unlink(dsn[1]) if err != nil { return nil, fmt.Errorf("error during the unlink syscall: error %v", err) } } return net.Listen(dsn[0], dsn[1]) case "tcp": return createTCPListener(dsn[1]) // not an tcp or unix default: return nil, fmt.Errorf("invalid Protocol ([tcp://]:6001, unix://file.sock), address: %s", address) } // wrong number of split parts default: return nil, fmt.Errorf("wrong number of parsed protocol parts, address: %s", address) } } func createTCPListener(addr string) (net.Listener, error) { cfg := tcplisten.Config{ ReusePort: true, DeferAccept: true, FastOpen: true, Backlog: 0, } listener, err := cfg.NewListener("tcp4", addr) if err != nil { return nil, err } return listener, nil } // fileExists checks if a file exists and is not a directory before we // try using it to prevent further errors. func fileExists(filename string) bool { info, err := os.Stat(filename) if os.IsNotExist(err) { return false } return !info.IsDir() }