typedef struct s_peer {
int id; //peer id
- int pieces; //number of pieces the peer has.
- char *bitfield; //list of pieces the peer has.
- char *bitfield_blocks; //list of blocks the peer has.
+ unsigned int bitfield; //list of pieces the peer has.
+ unsigned long long bitfield_blocks; //list of blocks the peer has.
short *pieces_count; //number of peers that have each piece.
- xbt_dynar_t current_pieces; //current pieces the peer is downloading
+ unsigned int current_pieces; //current pieces the peer is downloading
xbt_dict_t peers; //peers list
xbt_dict_t active_peers; //active peers list
int round; //current round for the chocking algorithm.
-
char mailbox[MAILBOX_SIZE]; //peer mailbox.
char mailbox_tracker[MAILBOX_SIZE]; //pair mailbox while communicating with the tracker.
const char *hostname; //peer hostname
msg_task_t task_received; //current task being received
msg_comm_t comm_received; //current comm
-
RngStream stream; //RngStream for
double begin_receive_time; //time when the receiving communication has begun, useful for calculating host speed.
-
} s_peer_t;
typedef s_peer_t *peer_t;
/** Peer main function */
int peer(int argc, char *argv[]);
+void get_status(char **status, unsigned int bitfield);
int get_peers_data(peer_t peer);
void leech_loop(peer_t peer, double deadline);
void seed_loop(peer_t peer, double deadline);
-void peer_init(peer_t peer, int id, int seed);
+peer_t peer_init(int id, int seed);
void peer_free(peer_t peer);
-int has_finished(char *bitfield);
+char* print_bitfield(unsigned int bitfield);
+int has_finished(unsigned int bitfield);
void handle_message(peer_t peer, msg_task_t task);
-void update_pieces_count_from_bitfield(peer_t peer, char *bitfield);
+void update_pieces_count_from_bitfield(peer_t peer, unsigned int bitfield);
void update_choked_peers(peer_t peer);
void update_interested_after_receive(peer_t peer);
int piece_complete(peer_t peer, int index);
int get_first_block(peer_t peer, int piece);
+int peer_has_not_piece(peer_t peer, unsigned int piece);
+int peer_is_not_downloading_piece(peer_t peer, unsigned int piece);
+int count_pieces(unsigned int bitfield);
+
int nb_interested_peers(peer_t peer);
int is_interested(peer_t peer, connection_t remote_peer);
int is_interested_and_free(peer_t peer, connection_t remote_peer);
-int in_current_pieces(peer_t peer, int piece);
int partially_downloaded_piece(peer_t peer, connection_t remote_peer);
void request_new_piece_to_peer(peer_t peer, connection_t remote_peer);
void send_request_to_peer(peer_t peer, connection_t remote_peer, int piece);
-void remove_current_piece(peer_t peer, connection_t remote_peer, int current_piece);
+void remove_current_piece(peer_t peer, connection_t remote_peer, unsigned int current_piece);
void update_active_peers_set(peer_t peer, connection_t remote_peer);
int select_piece_to_download(peer_t peer, connection_t remote_peer);