Port [2]byte // Server's listening TCP port number
UserCount int // Number of users connected to this particular server
PassID [4]byte // Random number generated by the server
- Name string // Server name
+ Name string // Server Name
Description string // Description of the server
+
+ readOffset int // Internal offset to track read progress
}
// Read implements io.Reader to write tracker registration payload bytes to slice
userCount := make([]byte, 2)
binary.BigEndian.PutUint16(userCount, uint16(tr.UserCount))
- return copy(p, slices.Concat(
+ buf := slices.Concat(
[]byte{0x00, 0x01}, // Magic number, always 1
tr.Port[:],
userCount,
[]byte(tr.Name),
[]byte{uint8(len(tr.Description))},
[]byte(tr.Description),
- )[:]), io.EOF
+ )
+
+ if tr.readOffset >= len(buf) {
+ return 0, io.EOF // All bytes have been read
+ }
+
+ n := copy(p, buf[tr.readOffset:])
+ tr.readOffset += n
+
+ return n, nil
}
func register(tracker string, tr *TrackerRegistration) error {
Version [2]byte // Old protocol (1) or new (2)
}
-// Message type 2 1 Sending list of servers
+// Message type 2 1 Sending list of servers
// Message data size 2 Remaining size of this request
// Number of servers 2 Number of servers in the server list
// Number of servers 2 Same as previous field
Port [2]byte
NumUsers [2]byte // Number of users connected to this particular server
Unused [2]byte
- NameSize byte // Length of name string
- Name []byte // Server name
+ NameSize byte // Length of Name string
+ Name []byte // Server Name
DescriptionSize byte
Description []byte
}
var servers []ServerRecord
for {
scanner.Scan()
+
var srv ServerRecord
- _, err = srv.Read(scanner.Bytes())
+ _, err = srv.Write(scanner.Bytes())
if err != nil {
return nil, err
}
return 12 + nameLen + descLen, data[0 : 12+nameLen+descLen], nil
}
-// Read implements io.Reader for ServerRecord
-func (s *ServerRecord) Read(b []byte) (n int, err error) {
+// Write implements io.Writer for ServerRecord
+func (s *ServerRecord) Write(b []byte) (n int, err error) {
copy(s.IPAddr[:], b[0:4])
copy(s.Port[:], b[4:6])
copy(s.NumUsers[:], b[6:8])