diff options
| author | Paul Buetow <paul@buetow.org> | 2023-06-18 13:40:26 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2023-06-18 13:40:26 +0300 |
| commit | 93b3e63e89594b2b7a05b791a5cfc366f10c763b (patch) | |
| tree | ec2b53bb30393481ce5d6c969bca62e577199ce0 /internal/tcp/tcp.go | |
| parent | e3c903c49c798531124a1c59859f47d04d4534b9 (diff) | |
add universal tcp message reader and writer
Diffstat (limited to 'internal/tcp/tcp.go')
| -rw-r--r-- | internal/tcp/tcp.go | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/internal/tcp/tcp.go b/internal/tcp/tcp.go new file mode 100644 index 0000000..3f9bafc --- /dev/null +++ b/internal/tcp/tcp.go @@ -0,0 +1,44 @@ +package tcp + +import ( + "encoding/binary" + "io" +) + +type Writer interface { + Write(b []byte) (n int, err error) +} + +type Reader interface { + Read(b []byte) (n int, err error) +} + +func WriteStr(w Writer, message string) error { + messageBytes := []byte(message) + sizeBytes := make([]byte, 8) + binary.BigEndian.PutUint64(sizeBytes, uint64(len(messageBytes))) + + if _, err := w.Write(sizeBytes); err != nil { + return err + } + if _, err := w.Write(messageBytes); err != nil { + return err + } + + return nil +} + +func ReadStr(r Reader) (string, error) { + sizeBytes := make([]byte, 8) + if _, err := io.ReadFull(r, sizeBytes); err != nil { + return "", err + } + messageSize := binary.BigEndian.Uint64(sizeBytes) + + messageBytes := make([]byte, messageSize) + if _, err := io.ReadFull(r, messageBytes); err != nil { + return "", err + } + + return string(messageBytes), nil +} |
