tracker/udp.go | 27 +++++++++++++++++++++++++++ tracker/udp_test.go | 20 ++++++++++++++++++++ diff --git a/tracker/udp.go b/tracker/udp.go new file mode 100644 index 0000000000000000000000000000000000000000..55e9ad37d5b84736d1a11338e07c61e96d8c88e1 --- /dev/null +++ b/tracker/udp.go @@ -0,0 +1,27 @@ +package tracker + +type UDPConnectionRequest struct { + ConnectionId int64 + Action int32 + TransctionId int32 +} + +type UDPAnnounceResponseHeader struct { + Action int32 + TransactionId int32 + Interval int32 + Leechers int32 + Seeders int32 +} + +type UDPAnnounceResponse struct { + UDPAnnounceResponseHeader + PeerAddrSlice +} + +type PeerAddr struct { + IP int32 + Port int16 +} + +type PeerAddrSlice []PeerAddr diff --git a/tracker/udp_test.go b/tracker/udp_test.go new file mode 100644 index 0000000000000000000000000000000000000000..cf4c0e01336eba92340bf7a4a3fe2f432950358c --- /dev/null +++ b/tracker/udp_test.go @@ -0,0 +1,20 @@ +package tracker + +import ( + "bytes" + "encoding/binary" + "testing" +) + +func TestMarshalUDPAnnounceResponse(t *testing.T) { + w := bytes.NewBuffer(nil) + if err := binary.Write(w, binary.BigEndian, &PeerAddrSlice{{1, 2}, {3, 4}}); err != nil { + t.Fatalf("error writing udp announce response addrs: %s", err) + } + if w.String() != "\x00\x00\x00\x01\x00\x02\x00\x00\x00\x03\x00\x04" { + t.FailNow() + } + if binary.Size(UDPAnnounceResponseHeader{}) != 20 { + t.FailNow() + } +}