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

除了上述的流程控制,还需要对每台peer主机跟踪状态。这里使用一个结构体记录跟踪信息,并且需要实时更改跟踪记录,如:从该主机下载的量、向该主机发起请求的量、是否被该主机认定为阻塞。如果足够专业,可以把这种监控扩展为一种有限状态机,但限于项目体量,一个结构体就足以完成任务。

type pieceProgress struct { index int client *client.Client buf []byte downloaded int requested int backlog int } func (state *pieceProgress) readMessage() error { msg, err := state.client.Read() if err != nil { return err } if msg == nil { // keep-alive return nil } switch msg.ID { case message.MsgUnchoke: state.client.Choked = false case message.MsgChoke: state.client.Choked = true case message.MsgHave: index, err := message.ParseHave(msg) if err != nil { return err } state.client.Bitfield.SetPiece(index) case message.MsgPiece: n, err := message.ParsePiece(state.index, state.buf, msg) if err != nil { return err } state.downloaded += n state.backlog -- } return nil }

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

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