92 lines
1.9 KiB
Go
92 lines
1.9 KiB
Go
|
|
package main
|
||
|
|
|
||
|
|
import (
|
||
|
|
"github.com/TransX/cipher"
|
||
|
|
"io"
|
||
|
|
"log"
|
||
|
|
"net"
|
||
|
|
)
|
||
|
|
|
||
|
|
type TransTCP struct {
|
||
|
|
// serverConn *net.Conn
|
||
|
|
clientConn net.Conn
|
||
|
|
listener net.Listener
|
||
|
|
// cache []byte
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewTransTCP() *TransTCP {
|
||
|
|
return &TransTCP{}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (this *TransTCP) CreateTCPClient(ip, port string) (err error) {
|
||
|
|
conn, err := net.Dial("tcp4", ip+":"+port)
|
||
|
|
if err == nil {
|
||
|
|
this.clientConn = conn
|
||
|
|
} else {
|
||
|
|
this.clientConn = nil
|
||
|
|
}
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
func (this *TransTCP) CreateTCPListener(ip, port string) (err error) {
|
||
|
|
listener, _err := net.Listen("tcp4", ip+":"+port)
|
||
|
|
if _err == nil {
|
||
|
|
this.listener = listener
|
||
|
|
return nil
|
||
|
|
} else {
|
||
|
|
return _err
|
||
|
|
}
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
func (this *TransTCP) Start(remoteAddr chan net.Addr) (err error) {
|
||
|
|
cache := make([]byte, 1024*128) //128kB
|
||
|
|
// this.cache = cache
|
||
|
|
for {
|
||
|
|
if listenerConn, _err := this.listener.Accept(); err == nil {
|
||
|
|
remoteAddr <- listenerConn.RemoteAddr()
|
||
|
|
//构建Carrier
|
||
|
|
revCarrier := &cipher.Carrier{
|
||
|
|
listenerConn,
|
||
|
|
cipher.NewCipher("default"),
|
||
|
|
cache,
|
||
|
|
}
|
||
|
|
sendCarrier := &cipher.Carrier{
|
||
|
|
this.clientConn,
|
||
|
|
cipher.NewCipher("default"),
|
||
|
|
cache,
|
||
|
|
}
|
||
|
|
go func() {
|
||
|
|
for {
|
||
|
|
nByte, _err := cipher.ReceiveData(revCarrier)
|
||
|
|
if _err != nil {
|
||
|
|
if _err == io.EOF {
|
||
|
|
revCarrier.Conn.Close()
|
||
|
|
sendCarrier.Conn.Close()
|
||
|
|
log.Println("EOF")
|
||
|
|
return
|
||
|
|
} else {
|
||
|
|
log.Println(revCarrier.Conn.RemoteAddr().String(), _err)
|
||
|
|
return //TODO:还需要处理
|
||
|
|
}
|
||
|
|
}
|
||
|
|
log.Println("Received ", nByte, " From ", revCarrier.Conn.RemoteAddr().String())
|
||
|
|
nByte, _err = cipher.SendData(sendCarrier, nByte)
|
||
|
|
if _err == nil {
|
||
|
|
log.Println("Send ", nByte, " To ", sendCarrier.Conn.RemoteAddr().String())
|
||
|
|
return
|
||
|
|
} else {
|
||
|
|
log.Println(sendCarrier.Conn.RemoteAddr().String(), _err)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
}()
|
||
|
|
|
||
|
|
} else {
|
||
|
|
err = _err
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|