int main(int argc, char *argv[]) { if (getuid()) { fprintf(stderr, "the ftpserver must started by root\n"); exit(EXIT_FAILURE); } if (signal(SIGCHLD, handle_sigchld) == SIG_ERR) ERR_EXIT("signal"); parse_load_file("ftpserver.conf"); printf("parse_load_file success\n"); // printconfig(); ip_to_clients = hash_alloc(256, hash_func); pid_to_ip = hash_alloc(256, hash_func); int listenfd; listenfd = tcp_server(listen_address, listen_port); printf("tcp_server success, listenfd = %d\n", listenfd); int connfd; pid_t pid; session_t sess; while (1) { struct sockaddr_in addr; connfd = accept_time_out(listenfd, &addr, accept_timeout); if (connfd == -1) { // printf("don't has connection in %d seconds\n", accept_timeout); continue; } uint32_t ip = addr.sin_addr.s_addr; printf("connect success\n"); session_init(&sess); num_of_clients++; sess.curr_clients = num_of_clients; sess.curr_ip_clients = add_ip_to_hash(ip_to_clients, ip); sess.ip = ip; p_sess = &sess; pid = fork(); if (pid == -1) { ERR_EXIT("fork error"); } else if (pid == 0) { //子进程 close(listenfd); sess.peerfd = connfd; session_begin(&sess); //建立一个会话 exit(EXIT_SUCCESS); } else { //父进程 close(connfd); hash_add_entry(pid_to_ip, &pid, sizeof(pid), &ip, sizeof(ip)); } } return 0; }
void add_clients_to_hash(session_t *sess, uint32_t ip) { ++num_of_clients; //连接数目+1 sess->curr_clients = num_of_clients; sess->curr_ip_clients = add_ip_to_hash(ip); }