summaryrefslogtreecommitdiff
path: root/rudp/net.go
diff options
context:
space:
mode:
authoranon5 <anon5clam@protonmail.com>2020-11-07 18:01:24 +0000
committeranon5 <anon5clam@protonmail.com>2020-11-07 18:01:24 +0000
commita865d2bce1aa097273fdb9d0d02d9cfa8460aefd (patch)
tree95ff9b35607b57b330ec579f4b96f84e3bf33349 /rudp/net.go
Initial public release
Diffstat (limited to 'rudp/net.go')
-rw-r--r--rudp/net.go44
1 files changed, 44 insertions, 0 deletions
diff --git a/rudp/net.go b/rudp/net.go
new file mode 100644
index 0000000..421a3e7
--- /dev/null
+++ b/rudp/net.go
@@ -0,0 +1,44 @@
+package rudp
+
+import (
+ "errors"
+ "net"
+ "strings"
+)
+
+// TODO: Use net.ErrClosed when Go 1.16 is released.
+var ErrClosed = errors.New("use of closed peer")
+
+/*
+netPkt.Data format (big endian):
+
+ ProtoID
+ Src PeerID
+ ChNo uint8 // Must be < ChannelCount.
+ RawPkt.Data
+*/
+type netPkt struct {
+ SrcAddr net.Addr
+ Data []byte
+}
+
+func readNetPkts(conn net.PacketConn, pkts chan<- netPkt, errs chan<- error) {
+ for {
+ buf := make([]byte, MaxNetPktSize)
+ n, addr, err := conn.ReadFrom(buf)
+ if err != nil {
+ // TODO: Change to this when Go 1.16 is released:
+ // if errors.Is(err, net.ErrClosed) {
+ if strings.Contains(err.Error(), "use of closed network connection") {
+ break
+ }
+
+ errs <- err
+ continue
+ }
+
+ pkts <- netPkt{addr, buf[:n]}
+ }
+
+ close(pkts)
+}