Beispiel #1
0
void *waitPeer(void *arg)
{
	int sockfd , newsockfd;
	int rc;
	struct sockaddr_in peer_addr;
	int peer_len=sizeof(peer_addr);
	sockfd=make_listen_port(g_peerport);	//写完了才看见这个函数,后悔啊。。。。

	printf("start to wait peet to connect me\n");
	while(!g_done)
	{
		newsockfd = accept(sockfd,(struct sockaddr *)&peer_addr, (socklen_t *)&peer_len);
		if(newsockfd<0)
		{
			perror("accept error\n");
			exit(1);
		}
		pthread_mutex_lock(&all_peer_lock);
		int pi;
		for(pi=0;pi<MAXPEER;pi++)
		{
			if(myPeer[pi].sockfd==newsockfd)break;
		}
		if(pi<MAXPEER)
		{
			pthread_mutex_unlock(&all_peer_lock);
			continue;	//重复的sockfd
		}
		for(pi=0;pi<MAXPEER;pi++)
		{
			if(myPeer[pi].sockfd==-1)break;
		}
		if(pi>=MAXPEER)
		{
			pthread_mutex_unlock(&all_peer_lock);
			shutdown(newsockfd,SHUT_RDWR);
			close(newsockfd);
			continue;		//peer 已满
		}
		myPeer[pi].sockfd=newsockfd;
		pthread_mutex_unlock(&all_peer_lock);

		myPeer[pi].choking=0;
		myPeer[pi].interested=1;
		myPeer[pi].choked=0;
		myPeer[pi].have_interest=1;
		if(myPeer[pi].bitmap!=NULL)
			free(myPeer[pi].bitmap);
		myPeer[pi].bitmap=NULL;
		myPeer[pi].next=NULL;
		myPeer[pi].state=0;

		pthread_t thr;
		rc=pthread_create(&thr,NULL,PToP,(void*)(myPeer+pi));	//二流合一
		if(rc)
			printf("wait peer create thread error");
	}
	return NULL;
}
Beispiel #2
0
int do_init(int argc, char **argv) {
	int i;
	char *CONF_FILE = "conf/login.conf";
	char *LANG_FILE = "conf/lang.conf";
	char *INTER_FILE = "conf/inter.conf";

	srand(gettick());
	set_logfile("log/login.log");
	set_dmpfile("log/login_dump.log");

	for (i = 1; i < argc ; i++) {
		if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "--h") == 0 || strcmp(argv[i], "--?") == 0 || strcmp(argv[i], "/?") == 0)
			help_screen();
		else if (strcmp(argv[i], "--conf") == 0)
			CONF_FILE=argv[i+1];
		else if (strcmp(argv[i],"--inter") == 0)
			INTER_FILE = argv[i+1];
		else if (strcmp(argv[i],"--lang") == 0)
			LANG_FILE = argv[i+1];
	}

	config_read(CONF_FILE);
	config_read(INTER_FILE);
	config_read("conf/char.conf");
	sql_handle = Sql_Malloc();
	if(sql_handle==NULL)
	{
		Sql_ShowDebug(sql_handle);
		exit(EXIT_FAILURE);
	}
	if( SQL_ERROR == Sql_Connect(sql_handle, sql_id, sql_pw, sql_ip, (uint16)sql_port, sql_db) )
	{
		printf("id: %s pass: %s Port: %d\n",sql_id, sql_pw,sql_port);
		Sql_ShowDebug(sql_handle);
		Sql_Free(sql_handle);
		exit(EXIT_FAILURE);
	}
	
	//sql_init();
	lang_read(LANG_FILE);
	set_termfunc(do_term);
	//zlib_init();
	add_log("");
	add_log("mYnexia Login Server Started.\n");

	set_defaultaccept(clif_accept);
	set_defaultparse(clif_parse);
	login_fd = make_listen_port(login_port);
	timer_insert(10 * 60 * 1000, 10 * 60 * 1000, Remove_Throttle, 0, 0);
	//Lockout DB
	bf_lockout=uidb_alloc(DB_OPT_BASE);
	
	printf("mYnexia Login Server is \033[1;32mready\033[0m! Listening at %d.\n", login_port);
	add_log("Server Ready! Listening at %d.\n", login_port);
	return 0;
}
Beispiel #3
0
int
main ( int argc, char *argv[] )
{
    int i;
    //init ListHead
    list_init(&P2PCB_head);
    list_init(&downloading_piece_head);

    //init mutex
    pthread_mutexattr_t mutex_attr;
    pthread_mutexattr_settype(&mutex_attr,PTHREAD_MUTEX_RECURSIVE_NP);
    pthread_mutex_init(&P2P_mutex,&mutex_attr);
    pthread_mutex_init(&download_mutex,&mutex_attr);
    pthread_mutex_init(&firstReq_mutex,&mutex_attr);
    pthread_mutex_init(&pieceCounter_mutex,&mutex_attr);

    // <-- deal with argument -->
    globalArgs.port = 6881;
    globalArgs.isseed = 0;
    globalArgs.torrentpath = NULL;
    int opt;
    while(opt = getopt(argc, argv, optstring), opt != -1){
        switch(opt){
            case 'p':
                {
                    globalArgs.port = atoi(optarg);
                    break;
                }
            case 'i':
                {
                    globalArgs.isseed = atoi(optarg);
                    break;
                }
            case 'v':
                {
                    globalArgs.verbose = true;
                    break;
                }
            case 'h':
                {
                    useage();
                    exit(0);
                    break;
                }
            case '?':
                {
                    useage();
                    exit(0);
                    break;
                }
            default:
                {
                    assert(false && "some amazing thing happen when parser argument");
                    break;
                }
        }
    }
    globalArgs.torrentpath = argv[argc - 1];
    // <-- end -->
#ifdef DEBUG
    printf("isseed:%d\n", globalArgs.isseed);
    printf("port:%d\n", globalArgs.port);
    printf("torrentpath:%s\n", globalArgs.torrentpath);
    printf("verbose:%s\n", (globalArgs.verbose)?"true":"false");
#endif
    
    // <-- set value of globalInfo -->
    init_peer_id(globalInfo.g_my_id); 
    globalInfo.g_peer_port = globalArgs.port;
    globalInfo.g_torrentmeta = parsetorrentfile(globalArgs.torrentpath); 
    if (globalInfo.g_torrentmeta == NULL){
        printf("Error when parsing torrent file\n");
        return -1;
    }
    for (i = 0; i < globalInfo.g_torrentmeta->filenum; i++){
        globalInfo.g_torrentmeta->flist[i].fp = createfile(globalInfo.g_torrentmeta->flist[i].filename, globalInfo.g_torrentmeta->flist[i].size);
    }
    globalInfo.bitfield = gen_bitfield(globalInfo.g_torrentmeta->pieces, globalInfo.g_torrentmeta->piece_len, globalInfo.g_torrentmeta->num_pieces);

#ifdef DEBUG
    printf("bitfield:");
    for (i = 0; i <= globalInfo.g_torrentmeta->num_pieces / 8; i++)
        printf("%X ", globalInfo.bitfield[i]);
    printf("\n");
#endif 

    //set piece_counter for "least first"
    piece_counter = (int *)malloc(sizeof(int)*globalInfo.g_torrentmeta->num_pieces);
    memset(piece_counter,0,sizeof(int)*globalInfo.g_torrentmeta->num_pieces);

    // <-- end -->
    
    // <-- create socket listen to port -->
    listenfd = make_listen_port(globalInfo.g_peer_port);
    if (listenfd == 0){
        printf("Error when create socket for binding:%s\n", strerror(errno));
        exit(-1);
    }
    pthread_t p_daemon;
    if (pthread_create(&p_daemon, NULL, daemon_listen, (void *)listenfd) != 0){
        int tmp = errno;
        printf("Error when create daemon thread: %s\n", strerror(tmp));
        return -1;
    }
    pthread_t p_speed;
    if (pthread_create(&p_speed, NULL, show_speed, NULL) != 0){
        int tmp = errno;
        printf("Error when create show_speed thread: %s\n", strerror(tmp));
        return -1;
    }

    announce_url_t *announce_info = parse_announce_url(globalInfo.g_torrentmeta->announce);
    if (globalArgs.verbose == true){
        printf("host: %s:%d\n", announce_info->hostname, announce_info->port);
    }
    struct hostent *tracker_hostent = gethostbyname(announce_info->hostname);
    if (tracker_hostent == NULL){
        printf("Error when get tracker host\n");
        return -1;
    }
    strcpy(globalInfo.g_tracker_ip, inet_ntoa(*((struct in_addr *)tracker_hostent->h_addr_list[0])));
    globalInfo.g_tracker_port = announce_info->port;
    free(announce_info);
    announce_info = NULL;

    // set the action after recv ctrl-c
    signal(SIGINT, client_shutdown);
    signal(SIGPIPE, SIG_IGN);
    
    int event_value = BT_STARTED;
    while(true){
        int sockfd = connect_to_host(globalInfo.g_tracker_ip, globalInfo.g_tracker_port);
#ifdef DEBUG
        printf("Sending request to tracker\n");
#endif
        int request_len = 0;
        char *request = make_tracker_request(&globalInfo, event_value, &request_len);
        event_value = -1;
#ifdef DEBUG
        printf("%s", request);
#endif
        if (send(sockfd, request, request_len, 0) == -1){
            int tmp = errno;
            printf("%s\n", strerror(tmp));
            // error when connect to tracker, wait some time and try again
            sleep(5);
            close(sockfd);
            free(request);
            continue;
        }

        tracker_response *tr = preprocess_tracker_response(sockfd);
        close(sockfd);

        globalInfo.g_tracker_response = get_tracker_data(tr->data, tr->size);
        free(tr->data);
        free(tr);

#ifdef DEBUG
        printf("Num Peers: %d\n", globalInfo.g_tracker_response->numpeers);
        for (i = 0; i < globalInfo.g_tracker_response->numpeers; i++){
            printf("Peer ip: %s:%d\n", globalInfo.g_tracker_response->peers[i].ip, globalInfo.g_tracker_response->peers[i].port);
        }
#endif
        for (i = 0; i < globalInfo.g_tracker_response->numpeers; i++){
            if (!exist_ip(globalInfo.g_tracker_response->peers[i].ip)){
                pthread_t tid;
                p2p_thread_param *param = (p2p_thread_param *)malloc(sizeof(p2p_thread_param));
                param->is_connecter = 1;
                param->port = globalInfo.g_tracker_response->peers[i].port;
                strcpy(param->ip, globalInfo.g_tracker_response->peers[i].ip);
                if (pthread_create(&tid, NULL, process_p2p_conn, param) != 0){
                    printf("Error when create thread to connect peer\n");
                } else {
                    printf("Success create thread to connect peer %s\n", globalInfo.g_tracker_response->peers[i].ip);
                }
            }
        }

        printf("sleep %d seconds\n", globalInfo.g_tracker_response->interval);
        sleep(globalInfo.g_tracker_response->interval);
    }

    return EXIT_SUCCESS;
}				/* ----------  end of function main  ---------- */
Beispiel #4
0
void *listen_peers(void *p)
{
    int listenfd = make_listen_port(g_peerport);
    while(1)
    {
        struct sockaddr_in cliaddr;
        int clilen = sizeof(cliaddr);
        int sockfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen);
        struct param_list my_param;
        char *ip = (char*)malloc(17*sizeof(char));
        memset(ip,0,17);
        strcpy(ip, inet_ntoa(cliaddr.sin_addr));
        my_param.ip = ip;
        my_param.sockfd = sockfd;
        pthread_t thread;
        printf("I listen a peer\n");
        pthread_create(&thread,NULL,peer_deal,(void *)&my_param);
        /*
        printf("listen_peer accept sockfd : %d\n",sockfd);
        char *ip = (char*)malloc(17*sizeof(char));
        memset(ip,0,17);
        strcpy(ip, inet_ntoa(cliaddr.sin_addr));
        int port = cliaddr.sin_port;
        printf("\033[31m""I have listen %s:%d\n""\033[m",ip,port);
        int i = 0;
        for(; i < MAXPEERS; i ++)
        {
            peer_t *ptr = &peers_pool[i];
            if(ptr->used == 1 && strcmp(ptr->ip, ip) == 0)
            {
                printf("\033[31m""111\n""\033[m");
                pthread_mutex_lock(&ptr->sock_mutex);
                if(ptr->sockfd < 0)
                {
                    ptr->sockfd = sockfd;
                    pthread_mutex_unlock(&ptr->sock_mutex);
                    break;
                }
                pthread_mutex_unlock(&ptr->sock_mutex);
            }
        }
        if(i != MAXPEERS )
        {
            pthread_t thread;
            int rc = pthread_create(&thread, NULL, recv_from_peer, (void *)i);
            if(rc)
            {
                printf("Error, return code from pthread_create() is %d\n", rc);
                exit(-1);
            }
        }
        else
        {
            printf("listen_peers close %d\n",sockfd);
            close(sockfd);
            sockfd = -1;
        }
        free(ip);
        */
    }
}