module github.com/anon55555/mt
-go 1.15
+go 1.16
}
// Accept waits for and returns a connecting Peer.
-// You should keep calling this until it returns ErrClosed
+// You should keep calling this until it returns net.ErrClosed
// so it doesn't leak a goroutine.
func (l *Listener) Accept() (*Peer, error) {
select {
case err := <-l.errs:
return nil, err
default:
- return nil, ErrClosed
+ return nil, net.ErrClosed
}
}
close(clt.accepted)
import (
"errors"
"net"
- "strings"
)
-// TODO: Use net.ErrClosed when Go 1.16 is released.
-var ErrClosed = errors.New("use of closed peer")
+// ErrClosed is deprecated, use net.ErrClosed instead.
+var ErrClosed = net.ErrClosed
/*
netPkt.Data format (big endian):
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") {
+ if errors.Is(err, net.ErrClosed) {
break
}
}
// Recv recieves a packet from the Peer.
-// You should keep calling this until it returns ErrClosed
+// You should keep calling this until it returns net.ErrClosed
// so it doesn't leak a goroutine.
func (p *Peer) Recv() (Pkt, error) {
select {
case err := <-p.errs:
return Pkt{}, err
default:
- return Pkt{}, ErrClosed
+ return Pkt{}, net.ErrClosed
}
}
return pkt, nil
select {
case <-p.Disco():
- return ErrClosed
+ return net.ErrClosed
default:
}
import (
"encoding/binary"
- "encoding/hex"
"errors"
"fmt"
"io"
}
func (e PktError) Error() string {
- return "error processing " + e.Type + " pkt: " +
- hex.EncodeToString(e.Data) + ": " +
- e.Err.Error()
+ return fmt.Sprintf("error processing %s pkt: %x: %v", e.Type, e.Data, e.Err)
}
func (e PktError) Unwrap() error { return e.Err }
type TrailingDataError []byte
func (e TrailingDataError) Error() string {
- return "trailing data: " + hex.EncodeToString([]byte(e))
+ return fmt.Sprintf("trailing data: %x", []byte(e))
}
func (p *Peer) processNetPkt(pkt netPkt) (err error) {
"net"
"os"
- "github.com/anon55555/mt/rudp"
+ "mt/rudp"
)
func main() {
for {
pkt, err := src.Recv()
if err != nil {
- if err == rudp.ErrClosed {
+ if err == net.ErrClosed {
msg := src.Addr().String() + " disconnected"
if src.TimedOut() {
msg += " (timed out)"
select {
case <-p.Disco():
- return nil, ErrClosed
+ return nil, net.ErrClosed
default:
}
}
go func() {
- resend := time.NewTicker(500 * time.Millisecond)
- defer resend.Stop()
-
for {
select {
- case <-resend.C:
+ case <-time.After(500 * time.Millisecond):
if _, err := p.sendRaw(relpkt); err != nil {
p.errs <- fmt.Errorf("failed to re-send timed out reliable seqnum: %d: %w", sn, err)
}