Closed nange closed 1 year ago
latest
Linux
We should exec TCPConn.CloseWrite() instead of SetReadDeadline when io.CopyBuffer() completed.
TCPConn.CloseWrite()
SetReadDeadline
io.CopyBuffer()
tun2socks --device tun://tun0 --proxy direct:// -interface wlp0s20f3
No response
package main import ( "fmt" "net" "os" ) func main() { if len(os.Args) <= 1 { fmt.Println("please enter some greeting message") return } conn, err := net.Dial("tcp", "your-ip:port") if err != nil { fmt.Println("dial:", err.Error()) return } defer conn.Close() if _, err := conn.Write([]byte(os.Args[1])); err != nil { fmt.Println("write greeting message to remote:", err.Error()) return } if err := conn.(*net.TCPConn).CloseWrite(); err != nil { fmt.Println("close write:", err.Error()) return } ret := make([]byte, 1024) nr, err := conn.Read(ret) if err != nil { fmt.Println("read from remote:", err.Error()) if nr > 0 { fmt.Println("read from remote:", string(ret[:nr])) } return } fmt.Println("read from remote:", string(ret[:nr])) }
package main import ( "fmt" "net" "os" "time" ) func main() { if len(os.Args) <= 1 { fmt.Println("please set server port using os.Args[1]") return } lis, err := net.Listen("tcp", ":"+os.Args[1]) if err != nil { fmt.Println("listen:", err.Error()) return } fmt.Println("server listen on :" + os.Args[1]) for { conn, err := lis.Accept() if err != nil { fmt.Println("accept:", err.Error()) continue } go handleConn(conn) } } func handleConn(conn net.Conn) { defer conn.Close() for { b := make([]byte, 1024) nr, err := conn.Read(b) if err != nil { fmt.Println("read:", err.Error()) if nr > 0 { fmt.Println("read err, bug got:", b[:nr]) } return } fmt.Println("read:", string(b[:nr])) time.Sleep(10 * time.Second) if _, err := conn.Write(b[:nr]); err != nil { fmt.Println("write to remote:", err.Error()) } } }
On local server:
read from remote: hello
read from remote: EOF
I'll create a PR soon.
Nice tests for shutting down part of full-duplex connection. It also helps me to check if another socks5 tunnel is working well.
Verify steps
Version
latest
What OS are you seeing the problem on?
Linux
Description
We should exec
TCPConn.CloseWrite()
instead ofSetReadDeadline
whenio.CopyBuffer()
completed.CLI or Config
tun2socks --device tun://tun0 --proxy direct:// -interface wlp0s20f3
Logs
No response
How to Reproduce
The source of client:
The source of remote:
Steps
What did you expect to see?
On local server:
What did you see instead?