はじめに
サーバを起動する時にポートは何でもよいので空きポートをListenしたい事がありました。
ウェルノウンポート以外を順に調べるしかないのかと思っていたのですが、
そんな面倒はなくポート0をListenすると空きポートが割り当てられます。
サンプル
以下はGoで書いた検証コードです。
main.go
package main
import (
"fmt"
"net"
)
func main() {
l, err := net.Listen("tcp", "localhost:0")
if err == nil {
defer l.Close()
addr := l.Addr().String()
_, port, err := net.SplitHostPort(addr)
if err == nil {
fmt.Printf(" listen port: %s\n", port)
} else {
fmt.Printf(" %s\n", addr)
}
} else {
fmt.Println("can't listen")
}
}
実行する度に異なるポートが割り当てられています。
実行結果
% go run main.go
listen port: 64522
% go run main.go
listen port: 64830
% go run main.go
listen port: 64835
% go run main.go
listen port: 64838