X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/blobdiff_plain/d80b37ca4c5801d5dbb5c4313a3d1d5fbdf2d593..041c2df698d4702816cf8472d212553d289a2c0c:/hotline/tracker.go?ds=sidebyside diff --git a/hotline/tracker.go b/hotline/tracker.go index 69d9fd4..2fc6004 100644 --- a/hotline/tracker.go +++ b/hotline/tracker.go @@ -36,7 +36,7 @@ func (tr *TrackerRegistration) Payload() []byte { ) } -func register(tracker string, tr TrackerRegistration) error { +func register(tracker string, tr *TrackerRegistration) error { conn, err := net.Dial("udp", tracker) if err != nil { return err @@ -49,9 +49,6 @@ func register(tracker string, tr TrackerRegistration) error { return nil } -type ServerListing struct { -} - const trackerTimeout = 5 * time.Second // All string values use 8-bit ASCII character set encoding. @@ -67,10 +64,10 @@ type TrackerHeader struct { Version [2]byte // Old protocol (1) or new (2) } -//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 +// 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 type ServerInfoHeader struct { MsgType [2]byte // always has value of 1 MsgDataSize [2]byte // Remaining size of request @@ -79,18 +76,21 @@ type ServerInfoHeader struct { } type ServerRecord struct { - IPAddr []byte - Port []byte - NumUsers []byte // Number of users connected to this particular server - Unused []byte + IPAddr [4]byte + 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’s name + Name []byte // Server name DescriptionSize byte Description []byte } func GetListing(addr string) ([]ServerRecord, error) { conn, err := net.DialTimeout("tcp", addr, trackerTimeout) + if err != nil { + return []ServerRecord{}, err + } defer func() { _ = conn.Close() }() _, err = conn.Write( @@ -110,7 +110,7 @@ func GetListing(addr string) ([]ServerRecord, error) { if readLen, err = conn.Read(buf); err != nil { return nil, err } - totalRead += readLen // 1514 + totalRead += readLen // 1514 var th TrackerHeader if err := binary.Read(bytes.NewReader(buf[:6]), binary.BigEndian, &th); err != nil { @@ -141,7 +141,6 @@ func GetListing(addr string) ([]ServerRecord, error) { totalSrv := int(binary.BigEndian.Uint16(info.SrvCount[:])) srvBuf := buf[14:totalRead] - totalRead += readLen var servers []ServerRecord @@ -163,11 +162,11 @@ func GetListing(addr string) ([]ServerRecord, error) { } func (s *ServerRecord) Read(b []byte) (n int, err error) { - s.IPAddr = b[0:4] - s.Port = b[4:6] - s.NumUsers = b[6:8] - s.NameSize = b[10] + copy(s.IPAddr[:], b[0:4]) + copy(s.Port[:], b[4:6]) + copy(s.NumUsers[:], b[6:8]) nameLen := int(b[10]) + s.Name = b[11 : 11+nameLen] s.DescriptionSize = b[11+nameLen] s.Description = b[12+nameLen : 12+nameLen+int(s.DescriptionSize)] @@ -176,13 +175,13 @@ func (s *ServerRecord) Read(b []byte) (n int, err error) { } func (s *ServerRecord) PortInt() int { - data := binary.BigEndian.Uint16(s.Port) + data := binary.BigEndian.Uint16(s.Port[:]) return int(data) } func (s *ServerRecord) Addr() string { return fmt.Sprintf("%s:%s", - net.IP(s.IPAddr), - strconv.Itoa(int(binary.BigEndian.Uint16(s.Port))), + net.IP(s.IPAddr[:]), + strconv.Itoa(int(binary.BigEndian.Uint16(s.Port[:]))), ) }