int main(int argc, char *argv[]) { int ret; if(argc != 2) { printf("usage:%s metafile\n",argv[0]); exit(-1); } // 设置信号处理函数 ret = set_signal_hander(); if(ret != 0) { printf("%s:%d error\n",__FILE__,__LINE__); return -1; } // 解析种子文件 ret = parse_metafile(argv[1]); if(ret != 0) { printf("%s:%d error\n",__FILE__,__LINE__); return -1; } // 初始化非阻塞peer init_unchoke_peers(); // 创建用于保存下载数据的文件 ret = create_files(); if(ret != 0) { printf("%s:%d error\n",__FILE__,__LINE__); return -1; } // 创建位图 ret = create_bitfield(); if(ret != 0) { printf("%s:%d error\n",__FILE__,__LINE__); return -1; } // 创建缓冲区 ret = create_btcache(); if(ret != 0) { printf("%s:%d error\n",__FILE__,__LINE__); return -1; } // 负责与所有Peer收发数据、交换消息 download_upload_with_peers(); // 做一些清理工作,主要是释放动态分配的内存 do_clear_work(); return 0; }
int main (int argc, char * argv[]) { bt_args_t bt_args; // structure to capture command-line arguments int i; // loop iterator int leecher_sock; // leecher's connection socket parse_args(&bt_args, argc, argv); if (bt_args.verbose) { // if verbose mode is requested printf("Args information from command line:\n"); printf("\tverbose: %d\n", bt_args.verbose); printf("\tsave_file: %s\n", bt_args.save_file); // display name of file to save to printf("\tlog_file: %s\n", bt_args.log_file); // display name of file to log information to printf("\ttorrent_file: %s\n", bt_args.torrent_file); // metainfo or torrent file being used by bt client // print information of all peers /*for (i = 0; i < MAX_CONNECTIONS; i++) { if(bt_args.peers[i] != NULL) print_peer(bt_args.peers[i]); else break; }*/ } // instantiate & allocate memory to bt_info_t struct that's inside bt_args bt_info_t *bt_info = (bt_info_t *) malloc(sizeof(bt_info_t)); // parse the torrent file to fill up contents of the bt_info structure with required information from the 'info' dictionary in .torrent file parse_torrent_file(&bt_args, bt_info); if (bt_args.bind == 1) { // bt client runs in seeder mode /* separate IPaddr:port from string following '-b'; generate bt client's ID; * get a handle on the seeder's data-exchange socket; * make seeder listen for incoming leecher connections */ init_seeder(&bt_args); create_bitfield(&bt_args, bt_info); printf("BITFIELD at SEEDER: '%s'\n", bt_args.bitfield->bits); // printf("testing, bt_args.bitfield->bits: '%s'\n", bt_args.bitfield->bits); // printf("testing, inside main, bt_args.bitfield->size: %ld\n", bt_args.bitfield->size); } else { // bt client runs in leecher mode for (i = 0; i < MAX_CONNECTIONS; i++) { if (bt_args.peers[i] != NULL) { // write all client (leecher) code here if (bt_args.verbose) { printf("Creating a leecher socket...\n"); } leecher_sock = init_leecher(bt_args.peers[i]); // run a leecher instance for each peer recorded in bt_args->peers[] unsigned char *handshake = malloc(100); // handshake information to be exchanged between peers init_handshake(bt_args.peers[i], handshake, bt_info); // send handshake over to seeder ssize_t bytes_written; if ( (bytes_written = write(leecher_sock, handshake, 100)) < 0 ) { fprintf(stderr, "ERROR: Could not write to leecher socket.\n"); exit(1); } } else break; } } // main client loop // printf("Starting Main Loop\n"); /* while(1){ // try to accept incoming connection from new peer // poll current peers for incoming traffic // write pieces to files // update peers' choke or unchoke status // responses to have/havenots/interested etc. // for peers that are not choked // request pieces from outcoming traffic // check livelness of peers and replace dead (or useless) peers // with new potentially useful peers // update peers, } */ return 0; }