Skip to content

Commit 07278fb

Browse files
committed
Retry system listen
1 parent c3a3f81 commit 07278fb

File tree

3 files changed

+32
-2
lines changed

3 files changed

+32
-2
lines changed

stack_system.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,15 @@ func (s *System) start() error {
120120
return nil
121121
})
122122
}
123+
var tcpListener net.Listener
123124
if s.inet4Address.IsValid() {
124-
tcpListener, err := listener.Listen(s.ctx, "tcp4", net.JoinHostPort(s.inet4ServerAddress.String(), "0"))
125+
for i := 0; i < 3; i++ {
126+
tcpListener, err = listener.Listen(s.ctx, "tcp4", net.JoinHostPort(s.inet4ServerAddress.String(), "0"))
127+
if !retryableListenError(err) {
128+
break
129+
}
130+
time.Sleep(time.Second)
131+
}
125132
if err != nil {
126133
return err
127134
}
@@ -130,7 +137,13 @@ func (s *System) start() error {
130137
go s.acceptLoop(tcpListener)
131138
}
132139
if s.inet6Address.IsValid() {
133-
tcpListener, err := listener.Listen(s.ctx, "tcp6", net.JoinHostPort(s.inet6ServerAddress.String(), "0"))
140+
for i := 0; i < 3; i++ {
141+
tcpListener, err = listener.Listen(s.ctx, "tcp6", net.JoinHostPort(s.inet6ServerAddress.String(), "0"))
142+
if !retryableListenError(err) {
143+
break
144+
}
145+
time.Sleep(time.Second)
146+
}
134147
if err != nil {
135148
return err
136149
}

stack_system_nonwindows.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
package tun
44

5+
import (
6+
"errors"
7+
8+
"golang.org/x/sys/unix"
9+
)
10+
511
func fixWindowsFirewall() error {
612
return nil
713
}
14+
15+
func retryableListenError(err error) bool {
16+
return errors.Is(err, unix.EADDRNOTAVAIL)
17+
}

stack_system_windows.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package tun
22

33
import (
4+
"errors"
45
"os"
56
"path/filepath"
67

78
"github.com/sagernet/sing-tun/internal/winfw"
9+
10+
"golang.org/x/sys/windows"
811
)
912

1013
func fixWindowsFirewall() error {
@@ -23,3 +26,7 @@ func fixWindowsFirewall() error {
2326
_, err = winfw.FirewallRuleAddAdvanced(rule)
2427
return err
2528
}
29+
30+
func retryableListenError(err error) bool {
31+
return errors.Is(err, windows.WSAEADDRNOTAVAIL)
32+
}

0 commit comments

Comments
 (0)