8 "github.com/anon55555/mt/rudp"
11 // A Pkt is a deserialized rudp.Pkt.
17 // Peer wraps rudp.Conn, adding (de)serialization.
22 func (p Peer) Send(pkt Pkt) (ack <-chan struct{}, err error) {
25 cmdNo = pkt.Cmd.(ToSrvCmd).toSrvCmdNo()
27 cmdNo = pkt.Cmd.(ToCltCmd).toCltCmdNo()
35 go func() (err error) {
36 defer w.CloseWithError(err)
38 buf := make([]byte, 2)
39 be.PutUint16(buf, cmdNo)
40 if _, err := w.Write(buf); err != nil {
43 return serialize(w, pkt.Cmd)
46 return p.Conn.Send(rudp.Pkt{r, pkt.PktInfo})
49 // SendCmd is equivalent to Send(Pkt{cmd, cmd.DefaultPktInfo()}).
50 func (p Peer) SendCmd(cmd Cmd) (ack <-chan struct{}, err error) {
51 return p.Send(Pkt{cmd, cmd.DefaultPktInfo()})
54 func (p Peer) Recv() (_ Pkt, rerr error) {
55 pkt, err := p.Conn.Recv()
60 buf := make([]byte, 2)
61 if _, err := io.ReadFull(pkt, buf); err != nil {
64 cmdNo := be.Uint16(buf)
68 newCmd = newToCltCmd[cmdNo]
70 newCmd = newToSrvCmd[cmdNo]
73 return Pkt{}, fmt.Errorf("unknown cmd: %d", cmdNo)
77 if err := deserialize(pkt, cmd); err != nil {
78 return Pkt{}, fmt.Errorf("%T: %w", cmd, err)
81 extra, err := io.ReadAll(pkt)
83 err = fmt.Errorf("%T: %w", cmd, rudp.TrailingDataError(extra))
85 return Pkt{cmd, pkt.PktInfo}, err
88 func Connect(conn net.Conn) Peer {
89 return Peer{rudp.Connect(conn)}
92 type Listener struct {
96 func Listen(conn net.PacketConn) Listener {
97 return Listener{rudp.Listen(conn)}
100 func (l Listener) Accept() (Peer, error) {
101 rpeer, err := l.Listener.Accept()
102 return Peer{rpeer}, err