对于多个程序绑定同一个端口我们遇到最多的是(Port 80 was already in use),也就是说端口被占用,不能重复绑定,但是操作系统内核支持通过配置socket参数的方式来实现多个进程绑定同一个端口。
简单示例
package main
import (
"context"
"golang.org/x/sys/windows"
"net"
"syscall"
)
var listenConfig = net.ListenConfig{
Control: MyControl,
}
func MyControl(network, address string, c syscall.RawConn) error {
return c.Control(func(fd uintptr) {
err := windows.SetsockoptInt(windows.Handle(fd), windows.SOL_SOCKET, windows.SO_REUSEADDR, 1)
if err != nil {
panic(err)
}
})
}
func main() {
listener, err := listenConfig.Listen(context.Background(), "tcp", "127.0.0.1:8080")
if err != nil {
panic(err)
}