设为首页 加入收藏

TOP

使用 .NET Core 开发 BT Tracker 服务器(五)
2019-09-17 18:24:21 】 浏览:81
Tags:使用 .NET Core 开发 Tracker 服务器
数量。 /// </summary> public long Left { get; private set; } public Peer() { } public Peer(AnnounceInputParameters inputParameters) { UniqueId = inputParameters.ClientAddress.ToString(); // 根据输入参数更新 Peer 的状态。 UpdateStatus(inputParameters); } /// <summary> /// 根据输入参数更新 Peer 的状态。 /// </summary> /// <param name="inputParameters">BT 客户端请求 Tracker 服务器时传递的参数。</param> public void UpdateStatus(AnnounceInputParameters inputParameters) { var now = DateTime.Now; var elapsedTime = (now - LastRequestTrackerTime).TotalSeconds; if (elapsedTime < 1) elapsedTime = 1; ClientAddress = inputParameters.ClientAddress; // 通过差值除以消耗的时间,得到每秒的大概下载速度。 DownloadSpeed = (int) ((inputParameters.Downloaded - DownLoaded) / elapsedTime); DownLoaded = inputParameters.Downloaded; UploadSpeed = (int) ((inputParameters.Uploaded) / elapsedTime); Uploaded = inputParameters.Uploaded; Left = inputParameters.Left; PeerId = inputParameters.PeerId; LastRequestTrackerTime = now; // 如果没有剩余数据,则表示 Peer 已经完成下载。 if (Left == 0) IsCompleted = true; } /// <summary> /// 将 Peer 信息进行 B 编码,按照协议处理为字典。 /// </summary> public BDictionary ToEncodedDictionary() { return new BDictionary { {TrackerServerConsts.PeerIdKey,new BString(PeerId)}, {TrackerServerConsts.Ip,new BString(ClientAddress.Address.ToString())}, {TrackerServerConsts.Port,new BNumber(ClientAddress.Port)} }; } /// <summary> /// 将 Peer 信息进行紧凑编码成字节组。 /// </summary> public byte[] ToBytes() { var portBytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short) ClientAddress.Port)); var addressBytes = ClientAddress.Address.GetAddressBytes(); var resultBytes = new byte[portBytes.Length + addressBytes.Length]; // 根据协议规定,首部的 4 字节为 IP 地址,尾部的 2 自己为端口信息 Array.Copy(addressBytes,resultBytes,addressBytes.Length); Array.Copy(portBytes,0,resultBytes,addressBytes.Length,portBytes.Length); return resultBytes; } }

5.3 管理种子与其 Peer 集合

BT 客户端请求 Tracker 服务器的目的只有一个,就是获取正在 下载同一个种子的 Peer 列表 ,明白了这一点之后就知道我们需要一个字典来管理种子与可用 Peer 集合的关系。

在上一节我们知道,客户端在请求 Tracker 服务器的时候会带上正在下载的种子唯一 Hash 值,而我们则可以根据这个 Hash 值来索引我们 Peer 列表。

PT 站的原理也是类似,会有一个种子表,这个表以种子的唯一 Hash 值作为主键,并添加某些扩展字段。(IMDB 评分、描述、视频信息等...)

这里我们定义一个 IBitTorrentManager 管理器对象,通过该对象来管理种子的状态,以及种子与 Peer 集合的状态。该接口的定义如下:

/// <summary>
/// 用于管理 BT 种子与其关联的 Peer 集合。
/// </summary>
public interface IBitTorrentManager
{
    /// <summary>
    /// 添加一个新的 Peer 到指定种子关联的集合当中。
    /// </summary>
    /// <param name="infoHash">种子的唯一标识。</param>
    /// <param name="inputParameters">BT 客户端传入的参数信息。</param>
    Peer AddPeer(string infoHash,AnnounceInputParameters inputParameters);
    
    /// <summary>
    /// 根据参数删除指定种子的 Peer 信息。
    /// </summary>
    /// <param name="infoHash">种子的唯一标识。</param>
    /// <param name="inputParameters">BT 客户端传入的参数信息。</param>
    void DeletePeer(string infoHash,AnnounceInputParameters inputParameters);

    /// <summary>
    /// 更新指定种子的某个 Peer 状态。
    /// </summary>
    /// <param name="infoHash">种子的唯一标识。</param>
    /// <param name="inputParameters">BT 客户端传入的参数信息。</param>
    void UpdatePeer(string infoHash, AnnounceInputParamet
首页 上一页 2 3 4 5 6 7 下一页 尾页 5/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇巧用XML配置校验导入Excel的列数.. 下一篇[古怪问题] Marshal.GetActiveObj..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目