int main(int argc, char *argv[]) { suppress_zombies(); struct sockaddr_in server_addr = create_server_addr(PORT); int listen_fd = create_listened_socket(server_addr); print_starting_message(server_addr); while (1) { struct sockaddr_in client_addr; socklen_t len = sizeof(client_addr); int connection_fd = safe_accept(listen_fd, (struct sockaddr *) &client_addr, &len); pid_t pid; if ((pid = fork()) == 0) { /* child */ close(listen_fd); server_main(connection_fd); close(connection_fd); exit(EXIT_SUCCESS); } /* parent */ close(connection_fd); } }
int main() { int sd = safe_socket_tcp(); int sum; char *all_ips[MAX_BUFFER]; char all_ips_len = 0; struct sockaddr_in adress; adress.sin_family = AF_INET; adress.sin_port = htons(PORT); adress.sin_addr.s_addr = INADDR_ANY; // bind to all ips safe_bind(sd, &adress); safe_listen(sd, 2); while (true) { struct sockaddr_in client_address; char *ip; int cd = safe_accept(sd, &client_address), i, cont = 0; printf("Received connection\n"); // found ip ip = inet_ntoa(client_address.sin_addr); for (i = 0; i < all_ips_len; i++) { if (strcmp(all_ips[i], ip) == 0) { cont = 1; break; } } if (cont == 1) { printf("Rejected connection\n"); safe_close(cd); continue; } // add to sum int client_number; read_int(cd, &client_number); sum += client_number; // add to ips pool printf("Got connection from %s\n", ip); char *put_ip = strdup(ip); all_ips[all_ips_len++] = put_ip; safe_close(cd); } safe_close(sd); return 0; }
int redir_accept2(struct redir_t *redir, int idx) { int status; int new_socket; struct sockaddr_in address; struct sockaddr_in baddress; socklen_t addrlen; char buffer[128]; addrlen = sizeof(struct sockaddr_in); if ((new_socket = safe_accept(redir->fd[idx], (struct sockaddr *)&address, &addrlen)) < 0) { if (errno != ECONNABORTED) log_err(errno, "accept()"); return 0; } #if(_debug_) log_dbg("new redir socket %d from %s", new_socket, inet_ntoa(address.sin_addr)); #endif addrlen = sizeof(struct sockaddr_in); if (getsockname(new_socket, (struct sockaddr *)&baddress, &addrlen) < 0) { log_warn(errno, "getsockname() failed!"); } if (ndelay_on(new_socket) < 0) { log_err(errno, "could not set ndelay"); } if (idx == 1 && _options.uamui) { if ((status = redir_fork(new_socket, new_socket)) < 0) { log_err(errno, "fork() returned -1!"); close(new_socket); return 0; } if (status > 0) { /* Parent */ close(new_socket); return 0; } safe_snprintf(buffer,sizeof(buffer),"%s", inet_ntoa(address.sin_addr)); setenv("TCPREMOTEIP",buffer,1); setenv("REMOTE_ADDR",buffer,1); safe_snprintf(buffer,sizeof(buffer),"%d",ntohs(address.sin_port)); setenv("TCPREMOTEPORT",buffer,1); setenv("REMOTE_PORT",buffer,1); char *binqqargs[2] = { _options.uamui, 0 } ; execv(*binqqargs, binqqargs); exit(-1); } else { redir_request *req = get_request(); req->parent = redir; log_dbg("redir_main() for %s", inet_ntoa(address.sin_addr)); req->last_active = mainclock_tick(); memcpy(&req->conn.peer, &address, sizeof (struct sockaddr_in)); memcpy(&req->baddr, &baddress, sizeof (struct sockaddr_in)); req->uiidx = idx; req->socket_fd = new_socket; conn_set_readhandler(&req->conn, redir_conn_read, req); conn_set_donehandler(&req->conn, redir_conn_finish, req); switch (redir_main(redir, new_socket, new_socket, &address, &baddress, idx, req)) { case 1: log_dbg("redir queued %s socket_fd=%d conn.fd=%d", inet_ntoa(address.sin_addr), req->socket_fd, req->conn.sock); req->state |= REDIR_SOCKET_FD; net_select_addfd(&sctx, req->socket_fd, SELECT_READ); return 1; case 0: log_dbg("redir completed %s", inet_ntoa(address.sin_addr)); redir_conn_finish(&req->conn, req); return 0; default: log_dbg("redir completed %s", inet_ntoa(address.sin_addr)); redir_conn_finish(&req->conn, req); return -1; } } return 0; }