Mainline DHTはTrackerなしでPeerを探すことができる。
- Trackerがなくてもデータを探せる
- 六次の隔たりで実現している
- 距離を定義してネットワークを構築する
本章では、Mainline DHT と呼ばれる機能の解説と実装をしていきます。
Qiitaに移動しました!!
GitBook なぜなにTorrent
ソース
REF
----------
Kyorohiro work
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | import 'dart:html' as html; import 'dart:web_gl' as webgl; import 'dart:typed_data' as data; void main() { var canvas = new html.CanvasElement(width: 500, height: 500); html.document.body.append(canvas); webgl.RenderingContext GL = canvas.getContext3d(); GL.clearColor(0.6, 0.2, 0.2, 1.0); GL.clear(webgl.RenderingContext.COLOR_BUFFER_BIT); // setup shader webgl.Shader vertexShader = loadShader(GL, webgl.RenderingContext.VERTEX_SHADER, "attribute vec3 vp;\n" + "void main() {\n" + " gl_Position = vec4(vp, 1.0);\n" + "}\n"); webgl.Shader fragmentShader = loadShader(GL, webgl.RenderingContext.FRAGMENT_SHADER, "precision mediump float;\n" + "void main() {\n" + " gl_FragColor = vec4(0.0,1.0,0.0,1.0);\n" + "}\n"); webgl.Program shaderProgram = GL.createProgram(); GL.attachShader(shaderProgram, fragmentShader); GL.attachShader(shaderProgram, vertexShader); GL.linkProgram(shaderProgram); GL.useProgram(shaderProgram); if (false == GL.getProgramParameter(shaderProgram, webgl.RenderingContext.LINK_STATUS)) { String message = "alert: Failed to linked shader"; throw new Exception("${message}\n"); } // // setup // leftup (x, y, z), leftdown, rightup, rightdown data.TypedData rectData = new data.Float32List.fromList([-0.8, 0.8, 0.0, -0.8, -0.8, 0.0, 0.8, 0.8, 0.0, 0.8, -0.8, 0.0]); data.TypedData rectDataIndex = new data.Uint16List.fromList([0, 1, 2, 1, 3, 2]); webgl.Buffer rectBuffer = GL.createBuffer(); GL.bindBuffer(webgl.RenderingContext.ARRAY_BUFFER, rectBuffer); GL.bufferData(webgl.ARRAY_BUFFER, rectData, webgl.RenderingContext.STATIC_DRAW); webgl.Buffer rectIndexBuffer = GL.createBuffer(); GL.bindBuffer(webgl.ELEMENT_ARRAY_BUFFER, rectIndexBuffer); GL.bufferDataTyped(webgl.RenderingContext.ELEMENT_ARRAY_BUFFER, rectDataIndex, webgl.RenderingContext.STATIC_DRAW); // // draw int locationVertexPosition = GL.getAttribLocation(shaderProgram, "vp"); GL.vertexAttribPointer(locationVertexPosition, 3, webgl.RenderingContext.FLOAT, false, 0, 0); GL.enableVertexAttribArray(locationVertexPosition); GL.drawElements(webgl.RenderingContext.TRIANGLES, 6, webgl.RenderingContext.UNSIGNED_SHORT, 0); } webgl.Shader loadShader(webgl.RenderingContext context, int type, var src) { webgl.Shader shader = context.createShader(type); context.shaderSource(shader, src); context.compileShader(shader); if (false == context.getShaderParameter(shader, webgl.RenderingContext.COMPILE_STATUS)) { String message = "Error compiling shader ${context.getShaderInfoLog(shader)}"; context.deleteShader(shader); throw new Exception("${message}\n"); } return shader; } |
1 2 3 4 5 6 7 8 9 10 11 12 | a() {
TrackerServer trackerServer = new TrackerServer(new HetiSocketBuilderChrome())
..address = "0.0.0.0"
..port = 6969;
trackerServer.start().then((StartResult result) {});
List<int> infoHash = new List.filled(20, 1);
trackerServer.addInfoHash(infoHash);
new Future.delayed(new Duration(minutes: 30)).then((_) {
trackerServer.stop();
});
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | b() {
TorrentFile torrentfile = null;
// ..
//create Torrent file Object from blob;
// ..
TrackerClient.createTrackerClient(new HetiSocketBuilderChrome(), torrentfile).then((TrackerClient client) {
client.downloaded = 0;
client.uploaded = 0;
client.event = TrackerClient.EVENT_STARTED;
client.requestWithSupportRedirect().then((TrackerRequestResult result) {
print("${result}");
});
});
}
|
import 'dart:html' as html; import 'dart:web_gl' as gl; void main() { var canvas = new html.CanvasElement(width: 500, height: 500); html.document.body.append(canvas); gl.RenderingContext GL = canvas.getContext3d(); double r = 0.6; double g = 0.2; double b = 0.2; double a = 1.0; GL.clearColor(r, g, b, a); GL.clear(gl.RenderingContext.COLOR_BUFFER_BIT); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | a() {
KNode node = new KNode(new HetiSocketBuilderChrome(), verbose: true);
String localIp = "0.0.0.0";
int localPort = 28080;
//
//
node.start(ip: localIp, port: localPort).then((_) {
node.onGetPeerValue.listen((KGetPeerValue v) {
print("---onGetPeerValue ${v.ipAsString} ${v.port} ${v.infoHashAsString} ");
});
});
//
// initial node
String initailNodeIp = "0.0.0.0";
int initailNodePort = 38080;
node.addBootringNode(initailNodeIp, initailNodePort);
//
// search target
List<int> infoHash = new List.filled(20, 4);
node.startSearchValue(new KId(infoHash), 18080, getPeerOnly: true);
new Future.delayed(new Duration(minutes:30)).then((_){
print(node.rootingtable.toInfo());
return node.stop();
});
}
|
Tetorica Retro Player を作成しました。 https://kyorohiro.itch.io/tetorica-retro-player 元々は、昔集めた動画や、ZIPで固めた漫画を、ブラウン管テレビやレトロゲーム機のような雰囲気で再生してみたい。 そんな...