/** execute_routine Execute a program, procedure, or * function. * * @param p_function_id : ptr to the routine symtab node */ void cx_executor::execute_routine (cx_symtab_node *p_function_id) { enter_routine(p_function_id); execute_compound(p_function_id); exit_routine(p_function_id); }
static void * server( void * th_dp){ // indicate num ++ pthread_mutex_lock(&mutex_n_th); n_client ++; pthread_mutex_unlock(&mutex_n_th); // fetch the 'packet' th_data_t * p = (th_data_t *)th_dp; // print something to the server printf("client %d joined, %d clients online now!\n",p->client_fd,n_client); // allocating buffer char * text; text = (char *)malloc(buffer_length); if(!text){ perror("malloc"); exit_routine(p); } while(1){ // read the data int rc_lth = read(p->client_fd, text, buffer_length - 1); if(rc_lth == 0){ printf("client close the socket %d\n", p->client_fd); free(text); exit_routine(p); } else if(rc_lth == -1){ perror("readline"); free(text); exit_routine(p); } rc_lth = send(p->client_fd, anwser_msg, strlen(anwser_msg)+1, MSG_NOSIGNAL ); if(rc_lth == 0){ printf("client close the socket %d\n", p->client_fd); free(text); exit_routine(p); } else if(rc_lth == -1){ perror("write"); free(text); exit_routine(p); } printf("user %d: %s\n",p->client_fd, text); if(!strcmp(text, "quit\n")){ free(text); exit_routine(p); } } pthread_exit(NULL);//never happen }
int main (int argc, char** argv) { int i, j, k, res, one; int main_sd, new_sd; socklen_t client_len; struct sockaddr_in client_addr, server_addr; char /*bool*/ exit_when_zero = 0; int port = VG_CLO_DEFAULT_LOGPORT; for (i = 1; i < argc; i++) { if (0==strcmp(argv[i], "--exit-at-zero") || 0==strcmp(argv[i], "-e")) { exit_when_zero = 1; } else if (atoi_portno(argv[i]) > 0) { port = atoi_portno(argv[i]); } else usage(); } banner("started"); signal(SIGINT, sigint_handler); conn_count = 0; for (i = 0; i < M_CONNECTIONS; i++) conn_fd[i] = 0; /* create socket */ main_sd = socket(AF_INET, SOCK_STREAM, 0); if (main_sd < 0) { perror("cannot open socket "); panic("main -- create socket"); } /* allow address reuse to avoid "address already in use" errors */ one = 1; if (setsockopt(main_sd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int)) < 0) { perror("cannot enable address reuse "); panic("main -- enable address reuse"); } /* bind server port */ server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(port); if (bind(main_sd, (struct sockaddr *) &server_addr, sizeof(server_addr) ) < 0) { perror("cannot bind port "); panic("main -- bind port"); } res = listen(main_sd,M_CONNECTIONS); if (res != 0) { perror("listen failed "); panic("main -- listen"); } while (1) { snooze(); /* enquire, using poll, whether there is any activity available on the main socket descriptor. If so, someone is trying to connect; get the fd and add it to our table thereof. */ { struct pollfd ufd; while (1) { ufd.fd = main_sd; ufd.events = POLLIN; ufd.revents = 0; res = poll(&ufd, 1, 0); if (res == 0) break; /* ok, we have someone waiting to connect. Get the sd. */ client_len = sizeof(client_addr); new_sd = accept(main_sd, (struct sockaddr *)&client_addr, &client_len); if (new_sd < 0) { perror("cannot accept connection "); panic("main -- accept connection"); } /* find a place to put it. */ assert(new_sd > 0); for (i = 0; i < M_CONNECTIONS; i++) if (conn_fd[i] == 0) break; if (i >= M_CONNECTIONS) { fprintf(stderr, "Too many concurrent connections. " "Increase M_CONNECTIONS and recompile.\n"); panic("main -- too many concurrent connections"); } conn_fd[i] = new_sd; conn_count++; printf("\n(%d) -------------------- CONNECT " "--------------------\n(%d)\n(%d) ", conn_count, conn_count, conn_count); fflush(stdout); } /* while (1) */ } /* We've processed all new connect requests. Listen for changes to the current set of fds. */ j = 0; for (i = 0; i < M_CONNECTIONS; i++) { if (conn_fd[i] == 0) continue; conn_pollfd[j].fd = conn_fd[i]; conn_pollfd[j].events = POLLIN /* | POLLHUP | POLLNVAL */; conn_pollfd[j].revents = 0; j++; } res = poll(conn_pollfd, j, 0 /* return immediately. */ ); if (res < 0) { perror("poll(main) failed"); panic("poll(main) failed"); } /* nothing happened. go round again. */ if (res == 0) { continue; } /* inspect the fds. */ for (i = 0; i < j; i++) { if (conn_pollfd[i].revents & POLLIN) { /* data is available on this fd */ res = read_from_sd(conn_pollfd[i].fd); if (res == 0) { /* the connection has been closed. */ close(conn_pollfd[i].fd); /* this fd has been closed or otherwise gone bad; forget about it. */ for (k = 0; k < M_CONNECTIONS; k++) if (conn_fd[k] == conn_pollfd[i].fd) break; assert(k < M_CONNECTIONS); conn_fd[k] = 0; conn_count--; printf("\n(%d) ------------------- DISCONNECT " "-------------------\n(%d)\n(%d) ", conn_count, conn_count, conn_count); fflush(stdout); if (conn_count == 0 && exit_when_zero) { printf("\n"); fflush(stdout); exit_routine(); } } } } /* for (i = 0; i < j; i++) */ } /* while (1) */ /* NOTREACHED */ }
static void sigint_handler ( int signo ) { exit_routine(); }