...
1 package network
2
3 import (
4 "bytes"
5 "encoding/binary"
6 "fmt"
7 "io"
8 "net"
9 "time"
10 )
11
12 func OpenConnection(address string) (*net.UDPConn, error) {
13 udpAddr, err := net.ResolveUDPAddr("udp", address)
14 if err != nil {
15 return nil, fmt.Errorf("Could not resolve address %s: %s", address, err)
16 }
17 conn, err := net.DialUDP("udp", nil, udpAddr)
18 if err != nil {
19 return nil, fmt.Errorf("Could not open connection to %s: %s", address, err)
20 }
21
22 conn.SetReadBuffer(2048)
23 conn.SetReadDeadline(time.Now().Add(5 * time.Second))
24
25 return conn, nil
26 }
27
28 func SendPacket(address string, packetType packettype_t, packetData any) (*net.UDPConn, error) {
29 conn, err := OpenConnection(address)
30 if err != nil {
31 return nil, fmt.Errorf("Could not open socket for sending a packet: %s", err)
32 }
33
34 err = SendPacketOnConnection(conn, packetType, packetData)
35
36 return conn, err
37 }
38
39 func SendPacketOnConnection(conn *net.UDPConn, packetType packettype_t, packetData any) error {
40 packet := makeHeader(packetType, packetData)
41 var err error
42 var buff bytes.Buffer
43 err = binary.Write(&buff, binary.LittleEndian, packet)
44 if err != nil {
45 return err
46 }
47 err = binary.Write(&buff, binary.LittleEndian, packetData)
48 if err != nil {
49 return err
50 }
51 _, err = io.Copy(conn, &buff)
52 return err
53 }
54
55 func ReadHeader(conn *net.UDPConn, data []byte) (h header, err error) {
56 var bs = make([]byte, 8 + len(data))
57 n, err := conn.Read(bs)
58 if err != nil {
59 return h, fmt.Errorf("Could not read resonse header after %d bytes: %s", n, err)
60 }
61
62 buf := bytes.NewBuffer(bs)
63 err = binary.Read(buf, binary.LittleEndian, &h)
64 if err != nil {
65 return h, fmt.Errorf("Could not read header from connection: %s", err)
66 }
67 buf.Read(data)
68 return
69 }
70
View as plain text