10 "github.com/anacrolix/torrent/util"
16 Peers util.CompactIPv4Peers
21 conns map[int64]struct{}
22 t map[[20]byte]torrent
25 func marshal(parts ...interface{}) (ret []byte, err error) {
27 for _, p := range parts {
28 err = binary.Write(&buf, binary.BigEndian, p)
37 func (s *server) respond(addr net.Addr, rh ResponseHeader, parts ...interface{}) (err error) {
38 b, err := marshal(append([]interface{}{rh}, parts...)...)
42 _, err = s.pc.WriteTo(b, addr)
46 func (s *server) newConn() (ret int64) {
49 s.conns = make(map[int64]struct{})
51 s.conns[ret] = struct{}{}
55 func (s *server) serveOne() (err error) {
56 b := make([]byte, 0x10000)
57 n, addr, err := s.pc.ReadFrom(b)
61 r := bytes.NewReader(b[:n])
69 if h.ConnectionId != connectRequestConnectionId {
73 err = s.respond(addr, ResponseHeader{
76 }, ConnectionResponse{
81 if _, ok := s.conns[h.ConnectionId]; !ok {
82 s.respond(addr, ResponseHeader{
83 TransactionId: h.TransactionId,
85 }, []byte("not connected"))
88 var ar AnnounceRequest
89 err = readBody(r, &ar)
94 b, err = t.Peers.MarshalBinary()
98 err = s.respond(addr, ResponseHeader{
99 TransactionId: h.TransactionId,
100 Action: ActionAnnounce,
101 }, AnnounceResponseHeader{
103 Leechers: t.Leechers,
108 err = fmt.Errorf("unhandled action: %d", h.Action)
109 s.respond(addr, ResponseHeader{
110 TransactionId: h.TransactionId,
112 }, []byte("unhandled action"))