Retry system listen

This commit is contained in:
世界 2024-10-14 22:10:16 +08:00
parent c3a3f8141f
commit 07278fb470
No known key found for this signature in database
GPG key ID: CD109927C34A63C4
3 changed files with 32 additions and 2 deletions

View file

@ -120,8 +120,15 @@ func (s *System) start() error {
return nil return nil
}) })
} }
var tcpListener net.Listener
if s.inet4Address.IsValid() { if s.inet4Address.IsValid() {
tcpListener, err := listener.Listen(s.ctx, "tcp4", net.JoinHostPort(s.inet4ServerAddress.String(), "0")) for i := 0; i < 3; i++ {
tcpListener, err = listener.Listen(s.ctx, "tcp4", net.JoinHostPort(s.inet4ServerAddress.String(), "0"))
if !retryableListenError(err) {
break
}
time.Sleep(time.Second)
}
if err != nil { if err != nil {
return err return err
} }
@ -130,7 +137,13 @@ func (s *System) start() error {
go s.acceptLoop(tcpListener) go s.acceptLoop(tcpListener)
} }
if s.inet6Address.IsValid() { if s.inet6Address.IsValid() {
tcpListener, err := listener.Listen(s.ctx, "tcp6", net.JoinHostPort(s.inet6ServerAddress.String(), "0")) for i := 0; i < 3; i++ {
tcpListener, err = listener.Listen(s.ctx, "tcp6", net.JoinHostPort(s.inet6ServerAddress.String(), "0"))
if !retryableListenError(err) {
break
}
time.Sleep(time.Second)
}
if err != nil { if err != nil {
return err return err
} }

View file

@ -2,6 +2,16 @@
package tun package tun
import (
"errors"
"golang.org/x/sys/unix"
)
func fixWindowsFirewall() error { func fixWindowsFirewall() error {
return nil return nil
} }
func retryableListenError(err error) bool {
return errors.Is(err, unix.EADDRNOTAVAIL)
}

View file

@ -1,10 +1,13 @@
package tun package tun
import ( import (
"errors"
"os" "os"
"path/filepath" "path/filepath"
"github.com/sagernet/sing-tun/internal/winfw" "github.com/sagernet/sing-tun/internal/winfw"
"golang.org/x/sys/windows"
) )
func fixWindowsFirewall() error { func fixWindowsFirewall() error {
@ -23,3 +26,7 @@ func fixWindowsFirewall() error {
_, err = winfw.FirewallRuleAddAdvanced(rule) _, err = winfw.FirewallRuleAddAdvanced(rule)
return err return err
} }
func retryableListenError(err error) bool {
return errors.Is(err, windows.WSAEADDRNOTAVAIL)
}