Created
February 20, 2021 14:47
-
-
Save beglov/1e8a686c1e4f392ad56170ec1a7925a0 to your computer and use it in GitHub Desktop.
Golang TCP server receiving/sending binary data
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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