From ac8b60e030841a7170c61fa550d2322fe87577f7 Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Mon, 30 Dec 2024 10:41:12 +0200 Subject: [PATCH] implement channel recv & send --- net/lux_channel.go | 46 +++++++++++++++++++++++++++++++-------- net/lux_datagram.go | 5 +++++ tests/lux_channel_test.go | 35 +++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 9 deletions(-) create mode 100644 net/lux_datagram.go create mode 100644 tests/lux_channel_test.go diff --git a/net/lux_channel.go b/net/lux_channel.go index c3e3295..925f5b6 100644 --- a/net/lux_channel.go +++ b/net/lux_channel.go @@ -10,9 +10,10 @@ const ( ) type LuxChannel struct { - Type LuxChannelType - Address *net.UDPAddr - conn *net.UDPConn + Type LuxChannelType + Address *net.UDPAddr + conn *net.UDPConn + preconnected bool } // bind udp socket to receive packets @@ -28,12 +29,14 @@ func NewLuxInboundChannel(udpStr string, chType LuxChannelType) (LuxChannel, err } return LuxChannel{ - Type: chType, - Address: addr, - conn: conn, + 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 { @@ -46,12 +49,37 @@ func NewLuxOutboundChannel(udpStr string, chType LuxChannelType) (LuxChannel, er } return LuxChannel{ - Type: chType, - Address: addr, - conn: conn, + 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() } diff --git a/net/lux_datagram.go b/net/lux_datagram.go new file mode 100644 index 0000000..186fcc2 --- /dev/null +++ b/net/lux_datagram.go @@ -0,0 +1,5 @@ +package net + +type LuxDatagram struct { + Payload []byte +} diff --git a/tests/lux_channel_test.go b/tests/lux_channel_test.go new file mode 100644 index 0000000..b7f362c --- /dev/null +++ b/tests/lux_channel_test.go @@ -0,0 +1,35 @@ +package tests + +import ( + "bytes" + "lux/net" + "testing" +) + +func TestRecvSend(t *testing.T) { + sv, err := net.NewLuxInboundChannel("127.0.0.2:65535", net.LuxChannelInterior) + if err != nil { + t.Fatal(t) + } + + cl, err := net.NewLuxOutboundChannel("127.0.0.2:65535", net.LuxChannelInterior) + if err != nil { + t.Fatal(t) + } + + dgram := net.LuxDatagram{Payload: []byte("TEEEESTTTT 3243492i0423")} + if err := cl.Send(dgram, sv.Address); err != nil { + t.Fatal(err) + } + + recv, _, err := sv.Recv() + if err != nil { + t.Fatal(err) + } + + if !bytes.Equal(dgram.Payload, recv.Payload) { + t.Log(dgram) + t.Log(recv) + t.Fatal("sent and recv payload not equal!") + } +}