java中是否有可用的torrent解析器来从.torrent文件中提取元数据......
我有一个小网络,我想用Bittorent跟踪器服务.但重要的是,在此网络中共享的信息不会意外地溢出分布式哈希表,从而允许未知对等体累积.我拥有跟踪器的所有常规功能,但我不知道如何强制客户端连接禁用某些控件(即DHT)并将群中的其他人暴露给外部连接.
协议规范中是否存在类似的控件?如果没有,实施它会涉及什么?
如何在 torrent 文件上生成 torrent 哈希信息。
我一直在看这个例子:如何使用 Java 计算 torrent 的哈希值,并尝试将其转换为 C++。这是我到目前为止的代码:
void At::ReadTorrent::TorrentParser::create_hash(std::string torrentstub)
{
std::string info;
int counter = 0;
while(info.find("4:info") == -1)
{
info.push_back(torrentstub[counter]);
counter++;
}
unsigned char array[torrentstub.size()];
int test = 0;
for(int data; (data = torrentstub[counter]) > -1;)
{
array[test++] = data;
counter++;
}
std::cout << array << std::endl;
//SHA-1 some value here to generate the hash.
}
Run Code Online (Sandbox Code Playgroud)
参数torrentstub是以字符串表示的 torrent 文件。据我了解,我必须获得之后的信息4:info。我认为这工作正常,例如:
d6:lengthi2847431620e4:name8:filename12:piece lengthi1143252e6:pieces50264
Run Code Online (Sandbox Code Playgroud)
之后只有我无法读取的信息,我猜这是一些二进制数据?
所以我的问题实际上可以归结为:应该对 后面的所有内容进行哈希处理的信息4:info,以及我应该在哪里停止收集哈希数据?
我想要连接到一点洪流跟踪器,http://tracker.thepiratebay.org.gethostbyname()保持返回null,我该如何解决这个问题?你还看到这个代码有什么问题吗?
int sock;
struct sockaddr_in servAddr;
int portNum = 80;
if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0){
printf("fail create socket");
return 0;
}
char *path = "http://tracker.thepiratebay.org/";
struct hostent *hp = gethostbyname(path);
if(hp==NULL){
printf("null");
else{
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
memcpy( (char *) &servAddr.sin_addr.s_addr, (char *) hp->h_addr, hp->h_length );
servAddr.sin_port = htons(portNum);
}
//send request to tracker server
if (send(sock, requestToSend, strlen(requestToSend), 0) != strlen(requestToSend)){
printf("fail send");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在思考BitTorrent的工作原理时,我想到了一些问题.如果有人可以分享一些可能的回复,我将不胜感激.
假设BitTorrent从跟踪器获得50个对等体,然后它与其中的20个建立连接以形成对等体.这个对等集是随机选择的还是基于它们的带宽?(我知道将根据提供的带宽选择未被禁用的对等体)随后,如何确定每个连接的带宽(ping可以给我们延迟但不是我假设的带宽)
乐观的unchoke会导致系统中的搭便车问题.考虑到unchoke可能并不总能带来更好的同行,为什么根本不可能放弃这个策略呢?(我假设这个策略可以帮助缓慢带宽的对等端来满足请求,为什么BitTorrent不能采用策略来探测乐观对等体的带宽而不发送数据包;并且为低带宽对等体提供另一个(可能是第5个连接)以便它们不要挨饿.这个第五频道只会传输一小部分频带而不是其他4个频道.这至少可以阻止搭便车吗?
节点:DHT 网络上的客户端。
Peers:尝试下载特定资源的客户端。
假设 DHT 网络是一个连通图,但没有节点可以访问所有其他节点(这种消费与 DHT 网络覆盖的互联网是完全连接的普遍看法相反)。
叠加在 DHT-network 上的 Peer-network 还是连通图吗?为什么?
我一直在做一些DHT抓取来弄清楚各种 BitTorrent 客户端的受欢迎程度。在我收集的结果中,一些最常见的版本字符串来自将自己标识为“BigUp”的客户端,但我找不到任何具有此名称的内容。以下是BEP10握手返回的版本字符串示例:
BigUp/11 libtrt/1.1.0.0 Downloader/12430
BigUp/11 libtrt/1.1.0.0 Downloader/12440
BigUp/11 libtrt/1.1.0.0 Downloader/12450
BigUp/12 libtrt/1.2.0.0 Downloader/12460
BigUp/12 libtrt/1.2.0.0 Downloader/12470
BigUp/12 libtrt/1.2.0.0 Downloader/12480
BigUp/12 libtrt/1.2.0.0 Downloader/12490
BigUp/12 libtrt/1.2.0.0 Downloader/12500
BigUp/12 libtrt/1.2.0.0 Downloader/12510
BigUp/12 libtrt/1.2.0.0 Downloader/12520
BigUp/12 libtrt/1.2.0.0 Downloader/12530
BigUp/12 libtrt/1.2.0.0 Downloader/12540
BigUp/12 libtrt/1.2.0.0 Downloader/1940
BigUp/12 libtrt/1.2.0.0 Downloader/1950
BigUp/12 libtrt/1.2.0.0 Downloader/1960
BigUp/12 libtrt/1.2.0.0 Downloader/1970
BigUp/12 libtrt/1.2.0.0 Downloader/1980
BigUp/12 libtrt/1.2.0.0 Downloader/1990
BigUp/12 libtrt/1.2.0.0 Downloader/2010
Run Code Online (Sandbox Code Playgroud)
版本号一直到BigUp/5 libtorrent/0.16.0.0,但这些并不常见。此外,他们共享的种子也很奇怪。以下是最常见的信息哈希示例:
3b2e1b303703b733f6407becc1140eae937d55ac
3b2e1b303703b733f6407becc1140eae937d55ac
4b21bf8f097a4e018ba2d2badf353012d686cd17
b16a48675e0fdb371238e4a6b075807bbd544c40
bd2045ad99b2f29f655ba566f26aedf50eae2780
d89a935c6e8c151b7b1a8278597a8dcba7d468b3
dbab2707740d3d3dadb16d1ea4d602959573cd05
dbf9a9a2815488c32a9c44aeb0af8ad04a33ebac
dde57ab80b8d0313f823e22e70af75ef6ec22882
debeeb0f4cad5861b322e55b8b18ed11169a27f4
Run Code Online (Sandbox Code Playgroud)
在我设法解析为 torrent …
我需要将文件发送给路由器后面的用户.我知道如果他在路由器上启用端口转发,我可以通过tcp连接执行此操作.我想避免这种情况,以便让我的应用程序更易于用户使用.所以我一直试图做tcp打孔,这几乎是不可能的.我设法做了udp puch holing.
如果您已经知道什么是udp打孔,那么您可以跳过这一部分:
所以我为了在恰好位于路由器后面的两个用户之间建立连接而做了什么.用户1通过udp协议与具有WAN IP地址的服务器通信.用户2也做同样的事情.好的,现在服务器知道每个用户的远程终点.服务器现在向用户2发送用户1的信息.服务器通知用户1用户2已收到该信息.用户2然后将包发送到用户1的路由器IP地址.该路由器接收的包被转发给用户1,因为它们来自服务器指定的端口.因此,如果用户2通过服务器指定的端口发送,则用户2发送给用户1的路由器的所有软件包都将到达用户1.当包裹到达用户1时,这些包裹到达用户2信息.用户1现在也知道如何向两个用户2发送数据.
所以现在我能够在两个恰好位于不同路由器后面的用户之间发送数据.我使用udp协议的原因是因为它在使用c#时类似于tcp.我一直试图用tcp做这个,但我不能让它工作.我正在装箱的这个应用程序是用c#编写的,当用户碰巧在同一台路由器后面时,一切都很好.但我知道我想扩展功能.
所以现在我终于迈出了第一步,将两个客户连接在一个不同的nat之后.唯一的问题是我设法做到这一点的唯一方法是使用upd协议.我一直在读,upd不能确保数据的传递,而且数据可能会以不同的顺序接收.
另一个选择是使用不同的协议,如ftp,bittorrent ...等我不知道是否有可能做ftp打孔虽然.
所以简而言之,我只是希望能够启用不同路由器后面的两个对等体,以便能够在服务器的帮助下进行通信.我不想通过ralying进行通信(连接从客户端A到服务器到客户端B),因为有时它很难管理,而且当很多用户使用它时维护起来很昂贵.也许我应该使用不同的协议,如bittorrent库,我没有这样做,因为我没有在互联网上找到一个很好的例子,告诉你如何使用该库.
我在DHT流量的bencoded字典中找到了一个条目,由BitTorrent生成,我不明白,也无法在http://bittorrent.org/beps/bep_0005.html的DHT规范中找到任何内容.
使用wireshark进行数据包查询和响应的示例:
query = {"a":{"id":".=...4...R..%..s~..;"}, "q":"ping", "t":"..oo", "v":"UThK", "y":"q"}
response = {"r":{"id":"..=..x......o....w/%"}, "t":"..oo", "v":"UT..", "y":"r"}
Run Code Online (Sandbox Code Playgroud)
完整的十六进制转储可以在这里找到:http://pastebin.com/SMB4f8LR.
此示例中的条目是"v":"UThK"查询和"v":"UT.."响应中的条目.它的目的是什么?
我一直对使用BitTorrent Sync同步我的文件感兴趣.我的问题是:我的加密种子数据是通过第三方计算机还是仅通过我注册的计算机共享?例如,如果我在3台计算机上安装Sync,那么所有同步数据都将保留在这3台计算机上,并且没有数据 - 加密或不加密 - 不会传输到安装了Sync的其他计算机.