From 24d1fba7c5eee9bf8cfd4bd45dcd2127042795c2 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 23 Jul 2015 16:21:46 +0200 Subject: Implement io.ReadWriter --- misc/main.go | 17 +++++++++-------- tde/tde.go | 42 ++++++++++++++++++++++++++---------------- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/misc/main.go b/misc/main.go index 4639621..dcf9b98 100644 --- a/misc/main.go +++ b/misc/main.go @@ -5,7 +5,7 @@ import ( "flag" "fmt" "log" - "net" + "io/ioutil" "dim13.org/asn1/tde" ) @@ -24,6 +24,7 @@ import ( */ var service = flag.String("service", "192.168.240.20:33333", "PBX CTI Service") +var conn tde.TDE func init() { flag.Parse() @@ -207,29 +208,29 @@ func dump(b []byte) { fmt.Println(hex.Dump(b)) } -func Ask(c net.Conn, out []byte) []byte { +func Ask(c tde.TDE, out []byte) []byte { log.Println("Ask") dump(out) - tde.Send(c, out) - in := tde.Recv(c) + c.Write(out) + in, _ := ioutil.ReadAll(c) log.Printf("Packet length: 0x%.2X\n", len(in)) dump(in) return in } -func Status(c net.Conn) { +func Status(c tde.TDE) { log.Println("Status") - in := tde.Recv(c) + in, _ := ioutil.ReadAll(c) log.Printf("Packet length: 0x%.2X\n", len(in)) dump(in) out := status out[4] = in[4] dump(out) - tde.Send(c, out) + c.Write(out) } func main() { - conn := tde.Dial(*service) + conn, _ = tde.Dial(*service) defer conn.Close() Ask(conn, associate) diff --git a/tde/tde.go b/tde/tde.go index 9413f09..664778d 100644 --- a/tde/tde.go +++ b/tde/tde.go @@ -4,36 +4,46 @@ import ( "encoding/binary" "log" "net" + "io" ) +type TDE struct { + net.Conn +} + var nbo = binary.BigEndian // Network Byte Order -func Send(c net.Conn, b []byte) { - size := int16(len(b)) - if err := binary.Write(c, nbo, size); err != nil { - log.Fatal(err) +func (t TDE) Write(p []byte) (n int, err error) { + size := int16(len(p)) + if err := binary.Write(t.Conn, nbo, size); err != nil { + return 0, err } - if err := binary.Write(c, nbo, b); err != nil { - log.Fatal(err) + if err := binary.Write(t.Conn, nbo, p); err != nil { + return 0, err } + return int(size), nil } -func Recv(c net.Conn) (b []byte) { +func (t TDE) Read(p []byte) (n int, err error) { var size int16 - if err := binary.Read(c, nbo, &size); err != nil { - log.Fatal(err) + if err := binary.Read(t.Conn, nbo, &size); err != nil { + return 0, err + } + if int(size) < len(p) { + p = p[:size] + err = io.EOF } - b = make([]byte, size) - if err := binary.Read(c, nbo, b); err != nil { - log.Fatal(err) + if err := binary.Read(t.Conn, nbo, p); err != nil { + return 0, err } - return + log.Println(err) + return int(size), err } -func Dial(service string) net.Conn { +func Dial(service string) (TDE, error) { conn, err := net.Dial("tcp", service) if err != nil { - log.Fatal(err) + return TDE{}, err } - return conn + return TDE{conn}, nil } -- cgit v1.2.3