From e867d90e8e78a3b3e92debe2583e5583a2d8769a Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 29 Sep 2015 10:09:58 +0200 Subject: Rename tde into spdu --- spdu/spdu.go | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 spdu/spdu.go (limited to 'spdu/spdu.go') diff --git a/spdu/spdu.go b/spdu/spdu.go new file mode 100644 index 0000000..688d5b4 --- /dev/null +++ b/spdu/spdu.go @@ -0,0 +1,50 @@ +// SPDU (Session Protocol Data Unit) +package spdu + +import ( + "encoding/binary" + "errors" + "io" + "net" +) + +// |<-- 2 octets -->|<-- maximum 240 octets -->| +// | header | acse/rose pdu | +// | big endian | | + +const maxLen = 240 // max PDU size + +type Conn struct{ net.Conn } + +func (c Conn) Write(p []byte) (n int, err error) { + size := uint16(len(p)) + if size > maxLen { + return 0, errors.New("PDU too big") + } + if err := binary.Write(c.Conn, binary.BigEndian, size); err != nil { + return 0, err + } + return c.Conn.Write(p) +} + +func (c Conn) Read(p []byte) (n int, err error) { + var size uint16 + if err := binary.Read(c.Conn, binary.BigEndian, &size); err != nil { + return 0, err + } + return c.Conn.Read(p[:size]) +} + +func ReadAll(r io.Reader) ([]byte, error) { + p := make([]byte, maxLen) + n, err := r.Read(p) + return p[:n], err +} + +func Dial(service string) (Conn, error) { + conn, err := net.Dial("tcp", service) + if err != nil { + return Conn{}, err + } + return Conn{conn}, nil +} -- cgit v1.2.3