// Package 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 // Conn spdu type Conn struct{ net.Conn } // Write spdu func (c Conn) Write(p []byte) (n int, err error) { size := uint16(len(p)) if size > maxLen { return 0, errors.New("PDU size too large") } if err := binary.Write(c.Conn, binary.BigEndian, size); err != nil { return 0, err } return c.Conn.Write(p) } // Read spdu 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]) } // ReadAll spdu func ReadAll(r io.Reader) ([]byte, error) { p := make([]byte, maxLen) n, err := r.Read(p) return p[:n], err } // Dial spdu func Dial(service string) (Conn, error) { conn, err := net.Dial("tcp", service) if err != nil { return Conn{}, err } return Conn{conn}, nil }