transx/tcp.go

92 lines
1.9 KiB
Go
Raw Normal View History

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
}