// 正确的关闭客户端 void client_shutdown(int sig) { // 设置全局停止变量以停止连接到其他peer, 以及允许其他peer的连接. Set global stop variable so that we stop trying to connect to peers and // 这控制了其他peer连接的套接字和连接到其他peer的线程. exit_window(); g_done=1; int sockfd = connect_to_host(g_tracker_ip, g_tracker_port); int request_len = 0; char *request = make_tracker_request(BT_STOPPED, &request_len); send(sockfd, request, request_len, 0); free(request); close(sockfd); close(g_peerport); close(listenfd); int i; for (i = 0; i <g_torrentmeta->filenum; i++){ if (g_torrentmeta->flist[i].fp!=NULL) fclose(g_torrentmeta->flist[i].fp); } sleep(1); exit(0); }
void save_config (GtkButton *button, gpointer user_data) { GtkTreeIter f_iter, h_iter; GValue f_value = {0}; GValue h_value = {0}; gchar *f_src, *f_dst, *h_val; gboolean delete_cond = FALSE, valid = TRUE; gint i, j; GtkWidget *dialog; Widgets *widgets = (Widgets*)user_data; if(gtk_tree_model_get_iter_first (widgets->store, &f_iter) && gtk_tree_model_get_iter_first (widgets->store_hidden, &h_iter)) { gtk_tree_model_get_iter_first (widgets->store_hidden, &h_iter); do { gtk_tree_model_get_value (widgets->store_hidden, &h_iter, 0, &h_value); gtk_tree_model_get_iter_first (widgets->store, &f_iter); do { gtk_tree_model_get_value (widgets->store, &f_iter, 0, &f_value); if(strcmp(g_value_get_string (&f_value), g_value_get_string (&h_value)) == 0) { if(!gtk_tree_store_remove (widgets->store_hidden, &h_iter)) { valid = FALSE; } delete_cond = TRUE; g_value_unset(&f_value); break; } g_value_unset(&f_value); gtk_tree_model_get_value (widgets->store, &f_iter, 1, &f_value); if(strcmp(g_value_get_string (&f_value), g_value_get_string (&h_value)) == 0) { if(!gtk_tree_store_remove (widgets->store_hidden, &h_iter)) { valid = FALSE; } delete_cond = TRUE; g_value_unset(&f_value); break; } g_value_unset(&f_value); } while (gtk_tree_model_iter_next (widgets->store, &f_iter)); g_value_unset(&h_value); if(delete_cond) { delete_cond = FALSE; } else { if(!gtk_tree_model_iter_next (widgets->store_hidden, &h_iter)) { valid = FALSE; } } } while (valid); } if(gtk_tree_model_get_iter_first (widgets->store, &f_iter)) { j=0; do { gtk_tree_model_get_value (widgets->store, &f_iter, 0, &f_value); f_src = g_value_get_string (&f_value); for(i=0; i<size_lang; i++) { if(strcmp(f_src, dicts[i].name) == 0) { favorite[j].src_code = i; break; } } g_value_unset(&f_value); gtk_tree_model_get_value (widgets->store, &f_iter, 1, &f_value); f_dst = g_value_get_string (&f_value); for(i=0; i<size_lang; i++) { if(strcmp(f_dst, dicts[i].name) == 0) { favorite[j].dst_code = i; break; } } g_value_unset(&f_value); //g_print ("\n%s -> %s", *f_src, *f_dst); j++; } while(gtk_tree_model_iter_next (widgets->store, &f_iter)); } for(i=0; i<sizeof(favorite)/sizeof(favorite[0]); i++) { if(favorite[i].src_code == -1) { break; } g_print("\n%d %d", favorite[i].src_code, favorite[i].dst_code); } if(gtk_tree_model_get_iter_first (widgets->store_hidden, &h_iter)) { j=0; do { gtk_tree_model_get_value (widgets->store_hidden, &h_iter, 0, &h_value); h_val = g_value_get_string (&h_value); for(i=0; i<size_lang; i++) { if(strcmp(h_val, dicts[i].name) == 0) { h_dict[j].code = i; break; } } g_value_unset(&h_value); j++; } while(gtk_tree_model_iter_next (widgets->store_hidden, &h_iter)); } for(i=0; i<sizeof(h_dict)/sizeof(h_dict[0]); i++) { if(h_dict[i].code == -1) { break; } g_print("\n%d", h_dict[i].code); } strcpy (shortcut[0].name, gtk_entry_get_text (widgets->entry_sn)); strcpy (shortcut[1].name, gtk_entry_get_text (widgets->entry_wn)); strcpy (shortcut[2].name, gtk_entry_get_text (widgets->entry_sf)); strcpy (shortcut[3].name, gtk_entry_get_text (widgets->entry_sb)); strcpy (shortcut[4].name, gtk_entry_get_text (widgets->log_file_entry)); strcpy (shortcut[5].name, gtk_entry_get_text (widgets->save_freq_entry)); save_config_file (conf_file, &shortcut, &favorite, &h_dict); exit_window (NULL, user_data); exit_code = 1; }