]> git.r.bdr.sh - rbdr/mobius/blame_incremental - hotline/handshake.go
Revert change to effectiveFile func
[rbdr/mobius] / hotline / handshake.go
... / ...
CommitLineData
1package hotline
2
3import (
4 "bytes"
5 "encoding/binary"
6 "errors"
7 "net"
8)
9
10type handshake struct {
11 Protocol [4]byte // Must be 0x54525450 TRTP
12 SubProtocol [4]byte
13 Version [2]byte // Always 1
14 SubVersion [2]byte
15}
16
17// Handshake
18// After establishing TCP connection, both client and server start the handshake process
19// in order to confirm that each of them comply with requirements of the other.
20// The information provided in this initial data exchange identifies protocols,
21// and their versions, used in the communication. In the case where, after inspection,
22// the capabilities of one of the subjects do not comply with the requirements of the other,
23// the connection is dropped.
24//
25// The following information is sent to the server:
26// Description Size Data Note
27// Protocol ID 4 TRTP 0x54525450
28// Sub-protocol ID 4 HOTL User defined
29// VERSION 2 1 Currently 1
30// Sub-version 2 2 User defined
31//
32// The server replies with the following:
33// Description Size Data Note
34// Protocol ID 4 TRTP
35// Error code 4 Error code returned by the server (0 = no error)
36func Handshake(conn net.Conn, buf []byte) error {
37 var h handshake
38 r := bytes.NewReader(buf)
39 if err := binary.Read(r, binary.BigEndian, &h); err != nil {
40 return err
41 }
42
43 if h.Protocol != [4]byte{0x54, 0x52, 0x54, 0x50} {
44 return errors.New("invalid handshake")
45 }
46
47 _, err := conn.Write([]byte{84, 82, 84, 80, 0, 0, 0, 0})
48 return err
49}