mirror of
https://github.com/SagerNet/sing-box.git
synced 2024-11-22 16:41:30 +00:00
Fix TFO async write
This commit is contained in:
parent
b1f289bce5
commit
fe8d46cce5
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue