]>
Commit | Line | Data |
---|---|---|
aebc4d36 JH |
1 | package hotline |
2 | ||
3 | import ( | |
4 | "bytes" | |
5 | "encoding/binary" | |
6 | "errors" | |
7 | "net" | |
8 | ) | |
9 | ||
10 | type 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) | |
36 | func 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 | } |