85 lines
1.6 KiB
Go
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()
|
|
}
|