mirror of
https://github.com/v2fly/v2ray-core.git
synced 2024-09-26 13:56:12 -04:00
63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
|
package tcp
|
||
|
|
||
|
import (
|
||
|
"net"
|
||
|
"io"
|
||
|
)
|
||
|
|
||
|
type VFreeConnection struct {
|
||
|
network string
|
||
|
address string
|
||
|
}
|
||
|
|
||
|
func NewVFreeConnection(network string, address string) *VFreeConnection {
|
||
|
conn := new(VFreeConnection)
|
||
|
conn.network = network
|
||
|
conn.address = address
|
||
|
return conn
|
||
|
}
|
||
|
|
||
|
func (vconn *VFreeConnection) Start(input <-chan []byte) chan<- []byte {
|
||
|
output := make(chan []byte, 128)
|
||
|
conn, err := net.Dial(vconn.network, vconn.address)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
|
||
|
finish := make(chan bool, 2)
|
||
|
go vconn.DumpInput(conn, input, finish)
|
||
|
go vconn.DumpOutput(conn, output, finish)
|
||
|
go vconn.CloseConn(conn, finish)
|
||
|
return output
|
||
|
}
|
||
|
|
||
|
func (vconn *VFreeConnection) DumpInput(conn net.Conn, input <-chan []byte, finish chan<- bool) {
|
||
|
for {
|
||
|
data, open := <-input
|
||
|
if !open {
|
||
|
finish <- true
|
||
|
break
|
||
|
}
|
||
|
conn.Write(data)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (vconn *VFreeConnection) DumpOutput(conn net.Conn, output chan<- []byte, finish chan<- bool) {
|
||
|
for {
|
||
|
buffer := make([]byte, 128)
|
||
|
nBytes, err := conn.Read(buffer)
|
||
|
if err == io.EOF {
|
||
|
finish <- true
|
||
|
break
|
||
|
}
|
||
|
output <- buffer[:nBytes]
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (vconn *VFreeConnection) CloseConn(conn net.Conn, finish <-chan bool) {
|
||
|
for i := 0; i < 2; i++ {
|
||
|
<-finish
|
||
|
}
|
||
|
conn.Close()
|
||
|
}
|