From 73a742a2ba10a7807251deea2f8f21d38a6e8646 Mon Sep 17 00:00:00 2001 From: irungentoo Date: Mon, 24 Jun 2013 10:42:55 -0400 Subject: Added distance function and changed some stuff. Also fixed typo in Readme. --- core/DHT.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 58 insertions(+), 13 deletions(-) (limited to 'core/DHT.c') diff --git a/core/DHT.c b/core/DHT.c index 4b1c6f13..80a54551 100644 --- a/core/DHT.c +++ b/core/DHT.c @@ -9,6 +9,30 @@ int sendpacket(IP_Port ip_port, char * data, uint32_t length) return sendto(sock, data, length, 0, (struct sockaddr *)&addr, sizeof(addr)); } +//Compares client_id1 and client_id2 with client_id +//return 0 if both are same distance +//return 1 if client_id1 is closer. +//return 2 if client_id2 is closer. +int id_distance(char * client_id, char * client_id1, char * client_id2) +{ + int i; + for(i = 0; i < CLIENT_ID_SIZE; i++) + { + if(abs(client_id[i] ^ client_id1[i]) < abs(client_id[i] ^ client_id2[i])) + { + return 1; + } + else if(abs(client_id[i] ^ client_id1[i]) > abs(client_id[i] ^ client_id2[i])) + { + return 2; + } + + } + + return 0; +} + + //Attempt to add client with ip_port and client_id to the friends client list and close_clientlist int addto_lists(IP_Port ip_port, char * client_id) { @@ -22,10 +46,10 @@ int addto_lists(IP_Port ip_port, char * client_id) //Currently incomplete: missing the ping_id part int pingreq(IP_Port ip_port) { - char data[37]; + char data[5 + CLIENT_ID_SIZE]; data[0] = 0; - memcpy(data + 5, self_client_id, 32); + memcpy(data + 5, self_client_id, CLIENT_ID_SIZE); sendpacket(ip_port, data, sizeof(data)); @@ -35,11 +59,11 @@ int pingreq(IP_Port ip_port) //Currently incomplete: missing the ping_id part int pingres(IP_Port ip_port, uint32_t ping_id) { - char data[37]; + char data[5 + CLIENT_ID_SIZE]; data[0] = 1; memcpy(data + 1, &ping_id, 4); - memcpy(data + 5, self_client_id, 32); + memcpy(data + 5, self_client_id, CLIENT_ID_SIZE); sendpacket(ip_port, data, sizeof(data)); @@ -49,11 +73,11 @@ int pingres(IP_Port ip_port, uint32_t ping_id) //Currently incomplete: missing the ping_id part int getnodes(IP_Port ip_port, char * client_id) { - char data[69]; + char data[5 + CLIENT_ID_SIZE*2]; data[0] = 2; - memcpy(data + 5, self_client_id, 32); - memcpy(data + 37, client_id, 32); + memcpy(data + 5, self_client_id, CLIENT_ID_SIZE); + memcpy(data + 5 + CLIENT_ID_SIZE, client_id, CLIENT_ID_SIZE); sendpacket(ip_port, data, sizeof(data)); } @@ -62,11 +86,11 @@ int getnodes(IP_Port ip_port, char * client_id) //Currently incomplete: missing the ping_id part int sendnodes(IP_Port ip_port, char * client_id) { - char data[325]; + char data[5 + (CLIENT_ID_SIZE + 6)*8]; data[0] = 3; - memcpy(data + 5, self_client_id, 32); - memcpy(data + 37, client_id, 32); + memcpy(data + 5, self_client_id, CLIENT_ID_SIZE); + memcpy(data + 5 + CLIENT_ID_SIZE, client_id, CLIENT_ID_SIZE); sendpacket(ip_port, data, sizeof(data)); } @@ -79,28 +103,50 @@ int sendnodes(IP_Port ip_port, char * client_id) int handle_pingreq(char * packet, uint32_t length, IP_Port source) { + if(length != 5 + CLIENT_ID_SIZE) + { + return 1; + } + uint32_t ping_id; memcpy(&ping_id, packet + 1, 4); - pingres(source, ping_id); + addto_lists(source, packet + 5); + + return 0; } int handle_pingres(char * packet, uint32_t length, IP_Port source) { + if(length != (5 + CLIENT_ID_SIZE)) + { + return 1; + } } int handle_getnodes(char * packet, uint32_t length, IP_Port source) { + if(length != (5 + CLIENT_ID_SIZE*2)) + { + return 1; + } + + addto_lists(source, packet + 5); + return 0; } int handle_sendnodes(char * packet, uint32_t length, IP_Port source) { + if(length > 325 || (length - 5) % (CLIENT_ID_SIZE + 6) != 0) + { + return 1; + } } @@ -148,14 +194,12 @@ void DHT_recvpacket(char * packet, uint32_t length, IP_Port source) switch (packet[0]) { case 0: handle_pingreq(packet, length, source); - //TODO: try to add requesting node to client_list if packet is valid break; case 1: handle_pingres(packet, length, source); break; case 2: handle_getnodes(packet, length, source); - //TODO: try to add requesting node to client_list if packet is valid break; case 3: handle_sendnodes(packet, length, source); @@ -171,6 +215,7 @@ void DHT_recvpacket(char * packet, uint32_t length, IP_Port source) + void doDHT() { -- cgit v1.2.3