Skip to content

Commit 8c777b6

Browse files
committed
add reuse port (SO_REUSEPORT) example
1 parent d553c0c commit 8c777b6

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

advanced/reuseport.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net"
7+
"net/http"
8+
"os"
9+
"syscall"
10+
)
11+
12+
var listenConfig = net.ListenConfig{
13+
Control: func(network, address string, c syscall.RawConn) error {
14+
var opErr error
15+
if err := c.Control(func(fd uintptr) {
16+
opErr = syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEPORT, 1)
17+
}); err != nil {
18+
return err
19+
}
20+
return opErr
21+
},
22+
}
23+
24+
func main() {
25+
pid := os.Getpid()
26+
listener, err := listenConfig.Listen(context.Background(), "tcp", "127.0.0.1:8080")
27+
if err != nil {
28+
panic(err)
29+
}
30+
server := &http.Server{}
31+
http.HandleFunc("/", func(rw http.ResponseWriter, req *http.Request) {
32+
rw.WriteHeader(http.StatusOK)
33+
fmt.Fprintf(rw, "Hello from PID %d \n", pid)
34+
fmt.Printf("serving to %v (%v) with PID %d \n", req.RemoteAddr, req.Header.Get("X-Forwarded-For"), pid)
35+
})
36+
fmt.Printf("HTTP Server with PID %d is running \n", pid)
37+
38+
panic(server.Serve(listener))
39+
}

0 commit comments

Comments
 (0)