lux/net/lux_channel.go
2024-12-30 10:41:12 +02:00

85 lines
1.6 KiB
Go

package net
import "net"
type LuxChannelType uint
const (
LuxChannelInterior = 0
LuxChannelExterior = 1
)
type LuxChannel struct {
Type LuxChannelType
Address *net.UDPAddr
conn *net.UDPConn
preconnected bool
}
// bind udp socket to receive packets
func NewLuxInboundChannel(udpStr string, chType LuxChannelType) (LuxChannel, error) {
addr, err := net.ResolveUDPAddr("udp", udpStr)
if err != nil {
return LuxChannel{}, err
}
conn, err := net.ListenUDP("udp", addr)
if err != nil {
return LuxChannel{}, err
}
return LuxChannel{
Type: chType,
Address: addr,
conn: conn,
preconnected: false,
}, nil
}
// udp socket to send datagrams
func NewLuxOutboundChannel(udpStr string, chType LuxChannelType) (LuxChannel, error) {
addr, err := net.ResolveUDPAddr("udp", udpStr)
if err != nil {
return LuxChannel{}, err
}
conn, err := net.DialUDP("udp", nil, addr)
if err != nil {
return LuxChannel{}, err
}
return LuxChannel{
Type: chType,
Address: addr,
conn: conn,
preconnected: true,
}, nil
}
const MAX_UDP_SIZE = 65535
func (ch *LuxChannel) Recv() (LuxDatagram, *net.UDPAddr, error) {
buf := make([]byte, MAX_UDP_SIZE)
len, addr, err := ch.conn.ReadFromUDP(buf)
if err != nil {
return LuxDatagram{}, nil, err
}
return LuxDatagram{
Payload: buf[:len],
}, addr, nil
}
func (ch *LuxChannel) Send(dgram LuxDatagram, addr *net.UDPAddr) error {
if ch.preconnected {
_, err := ch.conn.Write(dgram.Payload)
return err
} else {
_, err := ch.conn.WriteToUDP(dgram.Payload, addr)
return err
}
}
func (ch *LuxChannel) Close() {
ch.conn.Close()
}