Ejemplo n.º 1
0
void peerThread(void * arg){

   Info *info = (Info*) arg;
   int newsockfd = info->sock;
   char port[256];
   int x = savefiles(newsockfd, inet_ntoa(((struct sockaddr_in)info->addr).sin_addr), port);
   if(x == -1){ printf("error\n"); return; }

   char buffer[256];
   int n;

   while(1){
       
       n = dorecv(newsockfd, buffer, 256, 256);
      if(n == -2) {
         removepeer(inet_ntoa(((struct sockaddr_in)info->addr).sin_addr), port);
         printf("Peer Connection Terminated\n");
         return;
      }
       if(n == -1){ perror("can't receive from client"); continue;}
       
      printf("SERVER GOT MESSAGE: %s n: %d\n", buffer, n);

      if(strcmp(buffer,"list") == 0){
         sendlist(newsockfd);

      }else if(strncmp(buffer,"download ", 9) == 0){

			//peer downloaded a file so update the list

         printf("removing files\n");
         removepeer(inet_ntoa(((struct sockaddr_in)info->addr).sin_addr), port);
         printf("done removing files\n");
         printf("saving files\n");
         int x = savefiles(newsockfd, inet_ntoa(((struct sockaddr_in)info->addr).sin_addr), port);
         if(x == -1){ printf("error\n"); return; }
         printf("done saving files\n");

      }else if(strcmp(buffer,"exit") == 0){

         removepeer(inet_ntoa(((struct sockaddr_in)info->addr).sin_addr), port);

         printf("connection terminated\n");
         break;

      }else{

         sprintf(buffer, "unrecognized command %s", buffer);

      }

   }//end while
}
Ejemplo n.º 2
0
void
unregister_hash(char *buf, struct sockaddr_in *from_addr)
{
	tracker_unregister_t	*req = (tracker_unregister_t *)buf;
	peer_t			peer;
	int			index;
	int			i, j;

#ifdef	DEBUG
	fprintf(stderr, "unregister_hash:enter\n");
	fprintf(stderr, "unregister_hash:hash_table:before\n\n");
	print_hash_table();
#endif

	bzero(&peer, sizeof(peer));

	for (i = 0 ; i < req->numhashes ; ++i) {
		tracker_info_t	*info = &req->info[i];

		if (getpeers(info->hash, &index) != NULL) {
			for (j = 0 ; j < info->numpeers ; ++j) {
				peer.ip = info->peers[j].ip;
				removepeer(index, &peer, 1);
			}
		}
	}

#ifdef	DEBUG
	fprintf(stderr, "unregister_hash:hash_table:after\n\n");
	print_hash_table();
#endif
}
Ejemplo n.º 3
0
void
unregister_all(char *buf, struct sockaddr_in *from_addr)
{
	peer_t		peer;
	int		i;

#ifdef	DEBUG
	fprintf(stderr, "unregister_all:enter\n");
	fprintf(stderr, "unregister_all:hash_table:before\n\n");
	print_hash_table();
#endif

	peer.ip = from_addr->sin_addr.s_addr;

	if (hash_table->head >= hash_table->tail) {
		for (i = hash_table->head - 1;
				(i > hash_table->tail) && (i >= 0) ; --i) {
			removepeer(i, &peer, 0);
		}
	} else {
		for (i = hash_table->head - 1; i >= 0 ; --i) {
			removepeer(i, &peer, 0);
		}

		for (i = (hash_table->size - 1) ;
				(i > hash_table->tail) && (i >= 0) ; --i) {
			removepeer(i, &peer, 0);
		}
	}

	compact_hash_table();
	reclaim_free_entries();

	clear_dt_table_entry(peer.ip);

#ifdef	DEBUG
	fprintf(stderr, "unregister_all:hash_table:after\n\n");
	print_hash_table();
#endif

}
Ejemplo n.º 4
0
//removes a query
bool SGraph::removequery(int query){
	return removepeer(query);
}