You've already forked torrent-client
mirror of
https://github.com/veggiedefender/torrent-client.git
synced 2025-11-06 09:29:16 +02:00
36 lines
816 B
Go
36 lines
816 B
Go
package peers
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"fmt"
|
|
"net"
|
|
"strconv"
|
|
)
|
|
|
|
// Peer encodes connection information for a peer
|
|
type Peer struct {
|
|
IP net.IP
|
|
Port uint16
|
|
}
|
|
|
|
// Unmarshal parses peer IP addresses and ports from a buffer
|
|
func Unmarshal(peersBin []byte) ([]Peer, error) {
|
|
const peerSize = 6 // 4 for IP, 2 for port
|
|
numPeers := len(peersBin) / peerSize
|
|
if len(peersBin)%peerSize != 0 {
|
|
err := fmt.Errorf("Received malformed peers")
|
|
return nil, err
|
|
}
|
|
peers := make([]Peer, numPeers)
|
|
for i := 0; i < numPeers; i++ {
|
|
offset := i * peerSize
|
|
peers[i].IP = net.IP(peersBin[offset : offset+4])
|
|
peers[i].Port = binary.BigEndian.Uint16([]byte(peersBin[offset+4 : offset+6]))
|
|
}
|
|
return peers, nil
|
|
}
|
|
|
|
func (p Peer) String() string {
|
|
return net.JoinHostPort(p.IP.String(), strconv.Itoa(int(p.Port)))
|
|
}
|