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; }
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; }
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 ---------- */
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); */ } }