示例#1
0
文件: main.c 项目: drusong/BitTorrent
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;
}
示例#2
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;
}