Fix TFO async write

This commit is contained in:
世界 2023-09-09 19:51:10 +08:00
parent b1f289bce5
commit fe8d46cce5
No known key found for this signature in database
GPG key ID: CD109927C34A63C4

View file

@ -7,6 +7,7 @@ import (
"io" "io"
"net" "net"
"os" "os"
"sync"
"time" "time"
"github.com/sagernet/sing/common" "github.com/sagernet/sing/common"
@ -24,6 +25,7 @@ type slowOpenConn struct {
destination M.Socksaddr destination M.Socksaddr
conn net.Conn conn net.Conn
create chan struct{} create chan struct{}
access sync.Mutex
err error err error
} }
@ -60,16 +62,26 @@ func (c *slowOpenConn) Read(b []byte) (n int, err error) {
} }
func (c *slowOpenConn) Write(b []byte) (n int, err error) { func (c *slowOpenConn) Write(b []byte) (n int, err error) {
if c.conn == nil { if c.conn != nil {
c.conn, err = c.dialer.DialContext(c.ctx, c.network, c.destination.String(), b) return c.conn.Write(b)
if err != nil {
c.conn = nil
c.err = E.Cause(err, "dial tcp fast open")
}
close(c.create)
return
} }
return c.conn.Write(b) c.access.Lock()
defer c.access.Unlock()
select {
case <-c.create:
if c.err != nil {
return 0, c.err
}
return c.conn.Write(b)
default:
}
c.conn, err = c.dialer.DialContext(c.ctx, c.network, c.destination.String(), b)
if err != nil {
c.conn = nil
c.err = E.Cause(err, "dial tcp fast open")
}
close(c.create)
return
} }
func (c *slowOpenConn) Close() error { func (c *slowOpenConn) Close() error {