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 }
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 }
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 }
//removes a query bool SGraph::removequery(int query){ return removepeer(query); }