从零开始编写一个BitTorrent下载器 (11)

一般而言,BT客户端的任务队列就是5个,所以这里也设定为5个。任务队列的大小在不同网络环境中表现不同,常常提升至10个左右时表现会更好,因此较新的BT的客户端都会弹性调整队列大小。

// MaxBlockSize表示单个请求最多可以获取的字节数 const MaxBlockSize = 16384 // MaxBacklog表示客户端在管道中能够保有的最多未完成请求数 const MaxBacklog = 5 func attemptDownloadPiece(c *client.Client, pw *pieceWork) ([]byte, error) { state := pieceProgress{ index: pw.index, client: c, buf: make([]byte, pw.length), } // 设定超时检测以帮助删去不能正常运行的peers主机 c.Conn.SetDeadline(time.Now().Add(30 * time.Second)) defer c.Conn.SetDeadline(time.Time{}) for state.downloaded < pw.length { if !state.client.Choked { for state.backlog < MaxBacklog && state.requested < pw.length { blockSize := MaxBlockSize if pw.length - state.requested < blockSize { blockSize = pw.length - state.requested } err := c.SendRequest(pw.index, state.requested, blockSize) if err != nil { return nil, err } state.backlog ++ state.requested += blockSize } } err := state.readMessage() if err != nil { return nil, err } } return state.buf, nil } 主函数

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgfffd.html