void run_server(void) { long i; int op_fd; int nr_threads; pthread_t *p; op_fd = init_op_sock_server(); while(1) { nr_threads = recv_op(op_fd); p = malloc(sizeof(pthread_t) * nr_threads); if (!p) { perror("malloc"); exit(1); } /* create server worker */ for (i=0;i<nr_threads;i++) { pthread_create(&p[i], NULL, server_work, (void *)i); } /* assume recieving cancel operation */ recv_op(op_fd); for (i=0;i<nr_threads;i++) { pthread_cancel(p[i]); } for (i=0;i<nr_threads;i++) { pthread_join(p[i], NULL); } /* all workers are finished */ free(p); } close(op_fd); }
void connect() { if (socket_error || !socket->is_open()) { boost::asio::ip::tcp::resolver::query query(host, std::to_string(port)); boost::asio::connect(*socket, asio_resolver.resolve(query)); boost::asio::ip::tcp::no_delay option(true); socket->set_option(option); /* Timeout implementation */ if (send_timeout > 0) { timeout_op send_op(send_timeout, SO_SNDTIMEO); socket->set_option(send_op); } if (recv_timeout > 0) { timeout_op recv_op(recv_timeout, SO_RCVTIMEO); socket->set_option(recv_op); } socket_error = false; } }