use random tcp port for node when port is set to 0 (#3210)

This commit is contained in:
frank 2023-02-22 21:38:05 +08:00 committed by GitHub
parent 6f58ce2c61
commit cc283bfaab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 2 deletions

View File

@ -1 +1 @@
0.131.11 0.131.12

View File

@ -3,6 +3,7 @@ package node
import ( import (
"errors" "errors"
"fmt" "fmt"
"net"
"os" "os"
"path/filepath" "path/filepath"
@ -64,6 +65,36 @@ func MakeNode(config *params.NodeConfig, accs *accounts.Manager, db *leveldb.DB)
return stack, nil return stack, nil
} }
func getUsableTCPPort() (int, error) {
conn, err := net.ListenTCP("tcp", &net.TCPAddr{
IP: net.IPv4zero,
Port: 0,
})
if err != nil {
return 0, err
}
defer conn.Close()
return conn.Addr().(*net.TCPAddr).Port, nil
}
func handleListenAddr(listenAddr string) (string, error) {
if listenAddr == "" {
return "", nil
}
ip, port, err := net.SplitHostPort(listenAddr)
if err != nil {
return "", err
}
if port == "0" {
randomPort, err := getUsableTCPPort()
if err != nil {
return "", err
}
listenAddr = net.JoinHostPort(ip, fmt.Sprintf("%d", randomPort))
}
return listenAddr, nil
}
// newGethNodeConfig returns default stack configuration for mobile client node // newGethNodeConfig returns default stack configuration for mobile client node
func newGethNodeConfig(config *params.NodeConfig) (*node.Config, error) { func newGethNodeConfig(config *params.NodeConfig) (*node.Config, error) {
// NOTE: I haven't changed anything related to this parameters, but // NOTE: I haven't changed anything related to this parameters, but
@ -80,6 +111,11 @@ func newGethNodeConfig(config *params.NodeConfig) (*node.Config, error) {
maxPendingPeers = config.MaxPendingPeers maxPendingPeers = config.MaxPendingPeers
} }
listenAddr, err := handleListenAddr(config.ListenAddr)
if err != nil {
return nil, err
}
nc := &node.Config{ nc := &node.Config{
DataDir: config.DataDir, DataDir: config.DataDir,
KeyStoreDir: config.KeyStoreDir, KeyStoreDir: config.KeyStoreDir,
@ -89,7 +125,7 @@ func newGethNodeConfig(config *params.NodeConfig) (*node.Config, error) {
Version: config.Version, Version: config.Version,
P2P: p2p.Config{ P2P: p2p.Config{
NoDiscovery: true, // we always use only v5 server NoDiscovery: true, // we always use only v5 server
ListenAddr: config.ListenAddr, ListenAddr: listenAddr,
NAT: nat.Any(), NAT: nat.Any(),
MaxPeers: maxPeers, MaxPeers: maxPeers,
MaxPendingPeers: maxPendingPeers, MaxPendingPeers: maxPendingPeers,