Skip to content

Instantly share code, notes, and snippets.

@beglov
Created February 20, 2021 14:47
Show Gist options
  • Save beglov/1e8a686c1e4f392ad56170ec1a7925a0 to your computer and use it in GitHub Desktop.
Save beglov/1e8a686c1e4f392ad56170ec1a7925a0 to your computer and use it in GitHub Desktop.
Golang TCP server receiving/sending binary data
package main
import (
"bytes"
"encoding/binary"
"fmt"
"io"
"log"
"net"
"time"
)
type ReceivedMessage struct {
Version int16
TransmitterID int32
MessageType int16
DataType int16
Time uint32
SystolicPressure uint16
DiastolicPressure uint16
Pulse uint16
CRC uint16
}
type SentMessage struct {
Version int16
DataStatus int32
}
const GOOD int32 = 0x474F4F44
const BAD1 int32 = 0x42414431
func main() {
fmt.Println("Launching server on :8585...")
listener, err := net.Listen("tcp", ":8585")
if err != nil {
log.Fatal(err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Println("Error accepting connection:", err)
continue
}
fmt.Println("Accepted connection from", conn.RemoteAddr())
go handle(conn)
}
}
func handle(conn net.Conn) error {
defer conn.Close()
err := conn.SetDeadline(time.Now().Add(time.Second * 120))
if err != nil {
return err
}
for {
buf := make([]byte, 70000)
size, err := conn.Read(buf)
if err != nil {
if err == io.EOF {
return nil
}
return err
}
message := buf[:size]
reader := bytes.NewBuffer(message)
data := ReceivedMessage{}
err = binary.Read(reader, binary.BigEndian, &data)
if err != nil {
return err
}
fmt.Println("Version:", data.Version)
fmt.Println("TransmitterID:", data.TransmitterID)
fmt.Println("MessageType:", data.MessageType)
fmt.Println("DataType:", data.DataType)
fmt.Println("Time:", data.Time)
fmt.Println("SystolicPressure:", data.SystolicPressure)
fmt.Println("DiastolicPressure:", data.DiastolicPressure)
fmt.Println("Pulse:", data.Pulse)
fmt.Println("CRC:", data.CRC)
msg := SentMessage{
Version: 3,
DataStatus: GOOD,
}
err = binary.Write(conn, binary.BigEndian, msg)
if err != nil {
return err
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment