client.go | 29 +++++++++++++++++++++++++++++ connection.go | 1 + diff --git a/client.go b/client.go index ad1afff68a756896f18dc8f0807214e1d6877562..fe701146ed1d026c5c36d97c358e74c067461e74 100644 --- a/client.go +++ b/client.go @@ -291,6 +291,22 @@ } }() } +func (cl *Client) incomingPeerPort() int { + if cl.Listener == nil { + return 0 + } + _, p, err := net.SplitHostPort(cl.Listener.Addr().String()) + if err != nil { + panic(err) + } + var i int + _, err = fmt.Sscanf(p, "%d", &i) + if err != nil { + panic(err) + } + return i +} + func (me *Client) runConnection(sock net.Conn, torrent *torrent) (err error) { conn := &connection{ Socket: sock, @@ -364,9 +380,13 @@ d := map[string]interface{}{ "m": map[string]int{ "ut_metadata": 1, }, + "v": "go.torrent dev", } if torrent.metadataSizeKnown() { d["metadata_size"] = torrent.metadataSize() + } + if p := me.incomingPeerPort(); p != 0 { + d["p"] = p } b, err := bencode.Marshal(d) if err != nil { @@ -599,11 +619,20 @@ err = me.downloadedChunk(t, c, &msg) case pp.Extended: switch msg.ExtendedID { case pp.HandshakeExtendedID: + // TODO: Create a bencode struct for this. var d map[string]interface{} err = bencode.Unmarshal(msg.ExtendedPayload, &d) if err != nil { err = fmt.Errorf("error decoding extended message payload: %s", err) break + } + if reqq, ok := d["reqq"]; ok { + if i, ok := reqq.(int64); ok { + c.PeerMaxRequests = int(i) + } + } + if v, ok := d["v"]; ok { + c.PeerClientName = v.(string) } m, ok := d["m"] if !ok { diff --git a/connection.go b/connection.go index ddd875d416513f0fa6d2c542b98064a02a7f56bf..32f81480dea4f10185cc0f35e4c54e80f775bbd5 100644 --- a/connection.go +++ b/connection.go @@ -35,6 +35,7 @@ PeerExtensions [8]byte PeerPieces []bool PeerMaxRequests int // Maximum pending requests the peer allows. PeerExtensionIDs map[string]int64 + PeerClientName string } func (cn *connection) completedString() string {