static bool on_new_session_endpoint(void* context, ENDPOINT_HANDLE new_endpoint) { (void)context; session = session_create_from_endpoint(connection, new_endpoint, on_new_link_attached, NULL); session_set_incoming_window(session, 10000); session_begin(session); return true; }
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; }
int main(int argc, char const *argv[]) { check_permission(); setup_signal_chld(); parseconf_load_file("ftpserver.conf"); print_conf(); init_hash(); //创建一个监听fd int listenfd = tcp_server(tunable_listen_address, tunable_listen_port); pid_t pid; session_t sess; session_init(&sess); p_sess = &sess; //配置全局变量 while(1) { struct sockaddr_in addr; int peerfd = accept_timeout(listenfd, &addr, tunable_accept_timeout); if(peerfd == -1 && errno == ETIMEDOUT) continue; else if(peerfd == -1) ERR_EXIT("accept_timeout"); //获取ip地址,并在hash中添加一条记录 uint32_t ip = addr.sin_addr.s_addr; sess.ip = ip; add_clients_to_hash(&sess, ip); if((pid = fork()) == -1) ERR_EXIT("fork"); else if(pid == 0) { close(listenfd); sess.peerfd = peerfd; limit_num_clients(&sess); session_begin(&sess); exit(EXIT_SUCCESS); } else { //pid_to_ip add_pid_ip_to_hash(pid, ip); close(peerfd); } } return 0; }
int main(int argc, char const *argv[]) { if(getuid()) { fprintf(stderr, "FtpServer must be started by root\n"); exit(EXIT_FAILURE); } //创建一个监听fd int listenfd = tcp_server(NULL, 9981); pid_t pid; session_t sess; session_init(&sess); while(1) { int peerfd = accept_timeout(listenfd, NULL, 10); if(peerfd == -1 && errno == ETIMEDOUT) continue; else if(peerfd == -1) ERR_EXIT("accept_timeout"); if((pid = fork()) == -1) ERR_EXIT("fork"); else if(pid == 0) { close(listenfd); // sess.peerfd = peerfd; session_begin(&sess); } else { close(peerfd); } } return 0; }
int main (int argc, char *argv[]) { /* Create a session with the arguments given. Print the SID of the created session. */ session_id_t sid; parse_session_arguments (&argc, argv); if (argc < 2) { fprintf (stderr, "You must supply a key to begin the session!\n"); exit (1); } sid = session_begin (argv[1], 0); if (sid != (session_id_t) 0) printf ("Sid = %s\n", (char *)sid); else printf ("The key \"%s\" is already in use.\n", argv[1]); return (0); }