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 }