Skip to content

Commit

Permalink
Retry system listen
Browse files Browse the repository at this point in the history
  • Loading branch information
nekohasekai committed Oct 14, 2024
1 parent c3a3f81 commit 07278fb
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 2 deletions.
17 changes: 15 additions & 2 deletions stack_system.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,15 @@ func (s *System) start() error {
return nil
})
}
var tcpListener net.Listener
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 {
return err
}
Expand All @@ -130,7 +137,13 @@ func (s *System) start() error {
go s.acceptLoop(tcpListener)
}
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 {
return err
}
Expand Down
10 changes: 10 additions & 0 deletions stack_system_nonwindows.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,16 @@

package tun

import (
"errors"

"golang.org/x/sys/unix"
)

func fixWindowsFirewall() error {
return nil
}

func retryableListenError(err error) bool {
return errors.Is(err, unix.EADDRNOTAVAIL)
}
7 changes: 7 additions & 0 deletions stack_system_windows.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package tun

import (
"errors"
"os"
"path/filepath"

"github.com/sagernet/sing-tun/internal/winfw"

"golang.org/x/sys/windows"
)

func fixWindowsFirewall() error {
Expand All @@ -23,3 +26,7 @@ func fixWindowsFirewall() error {
_, err = winfw.FirewallRuleAddAdvanced(rule)
return err
}

func retryableListenError(err error) bool {
return errors.Is(err, windows.WSAEADDRNOTAVAIL)
}

0 comments on commit 07278fb

Please sign in to comment.