[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Mldonkey-commits] Changes to mldonkey/src/networks/bittorrent/bTTracker
From: |
mldonkey-commits |
Subject: |
[Mldonkey-commits] Changes to mldonkey/src/networks/bittorrent/bTTracker.ml |
Date: |
Sun, 10 Jul 2005 19:19:20 -0400 |
Index: mldonkey/src/networks/bittorrent/bTTracker.ml
diff -u mldonkey/src/networks/bittorrent/bTTracker.ml:1.13
mldonkey/src/networks/bittorrent/bTTracker.ml:1.14
--- mldonkey/src/networks/bittorrent/bTTracker.ml:1.13 Thu Jul 7 00:25:46 2005
+++ mldonkey/src/networks/bittorrent/bTTracker.ml Sun Jul 10 23:19:16 2005
@@ -33,11 +33,11 @@
open Bencode
-open Gettext
+open Gettext
let _s x = _s "BTTracker" x
let _b x = _b "BTTracker" x
-(*
+(*
We could have a a-la-edonkey tracker: it would connect back to incoming
client, and check whether they are accessible from the outside world,
@@ -65,7 +65,7 @@
mutable peer_port : int;
mutable peer_active : int;
}
-
+
type tracker = {
tracker_id : Sha1.t;
mutable tracker_table : (Sha1.t, tracker_peer) Hashtbl.t;
@@ -73,38 +73,37 @@
mutable tracker_message_content : string;
mutable tracker_message_time : int;
}
-
-let tracker_sock = ref None
+
+let tracker_sock = ref None
let tracked_files = Hashtbl.create 13
let ntracked_files = ref 0
-
+
let tracker_port = define_option bittorrent_section ["tracker_port"]
"The port to bind the tracker to"
int_option 6881
-
+
let max_tracked_files = define_option bittorrent_section ["max_tracked_files"]
"The maximal number of tracked files (to prevend saturation attack)"
int_option 100
-
+
let max_tracker_reply = define_option bittorrent_section ["max_tracker_reply"]
"The maximal number of peers returned by the tracker"
int_option 20
-
-
+
let int64_of_string v =
try
Int64.of_string v
with e ->
- lprintf "Exception %s in int64_of_string [%s]\n"
+ lprintf "Exception %s in int64_of_string [%s]\n"
(Printexc2.to_string e) v;
raise e
-
+
let int_of_string v =
try
int_of_string v
with e ->
- lprintf "Exception %s in int_of_string [%s]\n"
+ lprintf "Exception %s in int_of_string [%s]\n"
(Printexc2.to_string e) v;
raise e
@@ -117,11 +116,11 @@
let reply_has_tracker r info_hash peer_id peer_port peer_event =
- lprintf "tracker contacted for %s\n" (Sha1.to_string info_hash);
+ lprintf_nl "[BT]: tracker contacted for %s" (Sha1.to_string info_hash);
let tracker = try
- Hashtbl.find tracked_files info_hash
+ Hashtbl.find tracked_files info_hash
with Not_found ->
- lprintf "Need new tracker\n";
+ lprintf_nl "[BT]: Need new tracker";
if !ntracked_files < !!max_tracked_files then
let tracker = {
tracker_id = info_hash;
@@ -133,54 +132,56 @@
incr ntracked_files;
Hashtbl.add tracked_files info_hash tracker;
tracker
- else
- failwith "Too many tracked files"
+ else
+ failwith "BT]: Too many tracked files"
in
-
- let peer =
- try
- let peer =
+
+ let peer =
+ try
+ let peer =
Hashtbl.find tracker.tracker_table peer_id
in
peer.peer_ip <- fst (TcpBufferedSocket.peer_addr r.sock);
peer.peer_port <- peer_port;
peer.peer_active <- last_time ();
peer
- with _ ->
- let peer =
- {
+ with _ ->
+ let peer =
+ {
peer_id = peer_id;
peer_ip = fst (TcpBufferedSocket.peer_addr r.sock);
peer_port = peer_port;
peer_active = last_time ();
} in
- lprintf "adding new peer\n";
+ lprintf_nl "BT]: adding new peer";
Hashtbl.add tracker.tracker_table peer_id peer;
Fifo.put tracker.tracker_peers peer;
peer
in
let message =
match peer_event with
- "completed" -> void_message
+ "completed" ->
+ void_message
(* Reply with clients that could not connect to this tracker otherwise *)
- | "stopped" -> void_message
+ | "stopped" ->
+ void_message
(* Don't return anything *)
| _ ->
(* Return the 20 best peers. In fact, we should only return peers if
this peer is behind a firewall. *)
-
+
if tracker.tracker_message_time < last_time () then
-
+
let list = ref [] in
- lprintf "Tracker collecting peers:\n";
+ lprintf_nl "BT]: Tracker collecting peers:";
(try
for i = 1 to !!max_tracker_reply do
let peer = Fifo.take tracker.tracker_peers in
- lprintf " %s:%d\n" (Ip.to_string peer.peer_ip)peer.peer_port;
+ lprintf_nl " %s:%d" (Ip.to_string
peer.peer_ip)peer.peer_port;
list := peer :: !list
done
with _ -> ());
-
+
lprintf "Tracker sending %d peers\n" (List.length !list);
List.iter (fun p ->
lprintf "Tracker send: %s:%d\n"
@@ -189,45 +190,45 @@
) !list;
(* reply by sending [head] *)
-
- let message =
+
+ let message =
Dictionary [
String "interval", Int (Int64.of_int 600);
- String "peers", List
+ String "peers", List
(List.map (fun p ->
Dictionary [
- String "peer id", String
+ String "peer id", String
(Sha1.direct_to_string p.peer_id);
String "ip", String (Ip.to_string p.peer_ip);
- String "port",
+ String "port",
Int (Int64.of_int p.peer_port);
]
) !list)
]
in
let m = Bencode.encode message in
-
+
(* We cache the reply for one minute if we sent enough replies. *)
if List.length !list = !!max_tracker_reply then begin
tracker.tracker_message_time <- last_time () + 60;
tracker.tracker_message_content <- m;
end;
m
- else
+ else
tracker.tracker_message_content
in
-
- r.reply_content <- message
-
+
+ r.reply_content <- message
+
let http_handler t r =
try
add_reply_header r "Server" "MLdonkey";
add_reply_header r "Connection" "close";
add_reply_header r "Content-Type" "application/x-bittorrent";
-
+
match r.get_url.Url.short_file with
"/tracker" ->
-
+
let args = r.get_url.Url.args in
let info_hash = ref Sha1.null in
let peer_id = ref Sha1.null in
@@ -243,20 +244,22 @@
| "port" -> port := int_of_string arg
| "uploaded" -> uploaded := int64_of_string arg
| "downloaded" -> downloaded := int64_of_string arg
- | "left" -> left := int64_of_string arg
+ | "left" -> left := int64_of_string arg
| "event" -> event := arg
- | _ -> lprintf "BTTracker: Unexpected [%s=%s]\n" name arg
+ | _ -> lprintf_nl "BT]: BTTracker: Unexpected [%s=%s]" name arg
) args;
-
- lprintf "Connection received by tracker: \n";
- lprintf " info_hash: %s\n" (Sha1.to_string !info_hash);
- lprintf " event: %s\n" !event;
-
- reply_has_tracker r !info_hash !peer_id !port !event
-
+
+ lprintf_nl "[BT]: Connection received by tracker:";
+ lprintf_nl " info_hash: %s" (Sha1.to_string !info_hash);
+ lprintf_nl " event: %s" !event;
+ lprintf_nl " downloaded: %d" (Int64.to_int !downloaded);
+ lprintf_nl " uploaded: %d" (Int64.to_int !uploaded);
+
+ reply_has_tracker r !info_hash !peer_id !port !event
+
| filename ->
- lprintf "Request for .torrent [%s]\n" filename;
+ lprintf_nl "BT]: Request for .torrent [%s]" filename;
if (Filename2.last_extension filename <> ".torrent") then
failwith "Incorrect filename 1";
for i = 1 to String.length filename - 1 do
@@ -268,7 +271,7 @@
(* Try to find the .torrent file, normally in torrents/, but maybe
in sub-directories in former versions. *)
- let filename =
+ let filename =
let file_name = Filename.concat old_torrents_directory filename in
(* lprintf " xx [%s]/[%s]\n" file_name filename; *)
if Sys.file_exists file_name then file_name else
@@ -278,10 +281,10 @@
let file_name = Filename.concat tracked_directory filename in
(* lprintf " xx [%s]/[%s]\n" file_name filename; *)
if Sys.file_exists file_name then file_name else
- let file_name = Filename.concat seeded_directory filename in
+ let file_name = Filename.concat seeded_directory filename in
(* lprintf " xx [%s]/[%s]\n" file_name filename; *)
- if Sys.file_exists file_name then file_name else
- failwith
+ if Sys.file_exists file_name then file_name else
+ failwith
(Printf.sprintf "Tracker HTTPD: torrent [%s] not found" filename)
in
r.reply_content <- File.to_string filename
@@ -305,7 +308,7 @@
try
let s = File.to_string filename in
let (info_hash : Sha1.t), torrent = decode_torrent s in
- let tracker =
+ let tracker =
try
Hashtbl.find old_tracked_files info_hash
with Not_found ->
@@ -321,7 +324,7 @@
) filenames
*)
-let start_tracker () =
+let start_tracker () =
if !!tracker_port <> 0 then
let config = {
bind_addr = Unix.inet_addr_any ;
@@ -329,14 +332,14 @@
requests = [];
addrs = [ Ip.of_string "255.255.255.255" ];
base_ref = "";
- default = http_handler;
+ default = http_handler;
} in
let sock = TcpServerSocket.create "BT tracker"
- (Ip.to_inet_addr !!client_bind_addr)
+ (Ip.to_inet_addr !!client_bind_addr)
!!tracker_port (Http_server.handler config) in
tracker_sock := Some sock;
()
-
+
let stop_tracker () =
match !tracker_sock with
None -> ()