...

Source file src/go.formulabun.club/srb2kart/network/socket.go

Documentation: go.formulabun.club/srb2kart/network

     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)) // enough for the header
    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