8 "github.com/anon55555/mt/rudp"
11 const ChannelCount = rudp.ChannelCount
13 // A Pkt is a deserialized rudp.Pkt.
19 // Peer wraps rudp.Conn, adding (de)serialization.
24 func (p Peer) Send(pkt Pkt) (ack <-chan struct{}, err error) {
27 cmdNo = pkt.Cmd.(ToSrvCmd).toSrvCmdNo()
29 cmdNo = pkt.Cmd.(ToCltCmd).toCltCmdNo()
33 go func() (err error) {
34 defer w.CloseWithError(err)
36 buf := make([]byte, 2)
37 be.PutUint16(buf, cmdNo)
38 if _, err := w.Write(buf); err != nil {
41 return serialize(w, pkt.Cmd)
44 return p.Conn.Send(rudp.Pkt{r, pkt.PktInfo})
47 // SendCmd is equivalent to Send(Pkt{cmd, cmd.DefaultPktInfo()}).
48 func (p Peer) SendCmd(cmd Cmd) (ack <-chan struct{}, err error) {
49 return p.Send(Pkt{cmd, cmd.DefaultPktInfo()})
52 func (p Peer) Recv() (_ Pkt, rerr error) {
53 pkt, err := p.Conn.Recv()
58 buf := make([]byte, 2)
59 if _, err := io.ReadFull(pkt, buf); err != nil {
62 cmdNo := be.Uint16(buf)
66 newCmd = newToCltCmd[cmdNo]
68 newCmd = newToSrvCmd[cmdNo]
71 return Pkt{}, fmt.Errorf("unknown cmd: %d", cmdNo)
75 if err := deserialize(pkt, cmd); err != nil {
76 return Pkt{}, fmt.Errorf("%T: %w", cmd, err)
79 extra, err := io.ReadAll(pkt)
81 err = rudp.TrailingDataError(extra)
83 return Pkt{cmd, pkt.PktInfo}, err
86 func Connect(conn net.Conn) Peer {
87 return Peer{rudp.Connect(conn)}
90 type Listener struct {
94 func Listen(conn net.PacketConn) Listener {
95 return Listener{rudp.Listen(conn)}
98 func (l Listener) Accept() (Peer, error) {
99 rpeer, err := l.Listener.Accept()
100 return Peer{rpeer}, err