80 lines
1.5 KiB
Go
80 lines
1.5 KiB
Go
package communicator
|
|
|
|
import (
|
|
"log"
|
|
|
|
"github.com/TransX/tscipher"
|
|
)
|
|
|
|
type Sender interface {
|
|
//SendData(carrier *Carrier) (n int, err error)
|
|
Send() (n int, err error)
|
|
Close()
|
|
}
|
|
|
|
func NewNormalSender(carrier *tscipher.Carrier) *NormalSender {
|
|
r := new(NormalSender)
|
|
r.carrier = carrier
|
|
return r
|
|
}
|
|
|
|
type NormalSender struct {
|
|
Sender
|
|
carrier *tscipher.Carrier
|
|
}
|
|
|
|
func (this *NormalSender) Send() (n int, err error) {
|
|
carrier := this.carrier
|
|
msg, nByte := carrier.Msg.Get()
|
|
if len(msg) < nByte {
|
|
log.Panic("Cache of send is too small")
|
|
}
|
|
// if carrier.Cipher == nil {
|
|
// n, err = carrier.Conn.Write(msg[:nByte])
|
|
// carrier.Cache.Put(make([]byte, 1024*4), 1024*4)
|
|
// return
|
|
// }
|
|
encrypedByte, err := carrier.Cipher.Encrypt(msg[:nByte])
|
|
if err != nil {
|
|
n = 0
|
|
return
|
|
}
|
|
//打包
|
|
wraped := tscipher.WrapPackage(encrypedByte[:nByte])
|
|
n, err = carrier.Conn.Write(wraped)
|
|
carrier.Cache.Put(make([]byte, 1024*4), 1024*4)
|
|
return
|
|
}
|
|
|
|
func (this *NormalSender) Close() {
|
|
this.carrier.Conn.Close()
|
|
}
|
|
|
|
func NewDirectSender(carrier *tscipher.Carrier) *DirectSender {
|
|
r := new(DirectSender)
|
|
r.carrier = carrier
|
|
return r
|
|
}
|
|
|
|
type DirectSender struct {
|
|
Sender
|
|
carrier *tscipher.Carrier
|
|
}
|
|
|
|
func (this *DirectSender) Send() (n int, err error) {
|
|
carrier := this.carrier
|
|
msg, nByte := carrier.Msg.Get()
|
|
if len(msg) < nByte {
|
|
log.Panic("Cache of send is too small")
|
|
}
|
|
|
|
n, err = carrier.Conn.Write(msg[:nByte])
|
|
carrier.Cache.Put(make([]byte, 1024*4), 1024*4)
|
|
return
|
|
|
|
}
|
|
|
|
func (this *DirectSender) Close() {
|
|
this.carrier.Conn.Close()
|
|
}
|