static void usage(void) { ph_fdprintf(STDERR_FILENO, " -h HOST - which address to connect\n" " -p PORTNO - which port to connect\n" ); exit(EX_USAGE); }
int main(int argc, char **argv) { int c; uint16_t portno = 8080; char *addrstring = NULL; ph_sockaddr_t addr; ph_listener_t *lstn; bool use_v4 = false; // Must be called prior to calling any other phenom functions ph_library_init(); while ((c = getopt(argc, argv, "p:l:4")) != -1) { switch (c) { case '4': use_v4 = true; break; case 'l': addrstring = optarg; break; case 'p': portno = atoi(optarg); break; default: ph_fdprintf(STDERR_FILENO, "Invalid parameters\n" " -4 - interpret address as an IPv4 address\n" " -l ADDRESS - which address to listen on\n" " -p PORTNO - which port to listen on\n" ); exit(EX_USAGE); } } // Set up the address that we're going to listen on if ((use_v4 && ph_sockaddr_set_v4(&addr, addrstring, portno) != PH_OK) || (!use_v4 && ph_sockaddr_set_v6(&addr, addrstring, portno) != PH_OK)) { ph_fdprintf(STDERR_FILENO, "Invalid address [%s]:%d", addrstring ? addrstring : "*", portno ); exit(EX_USAGE); } // Register our memtype mt_state = ph_memtype_register(&mt_state_def); // Optional config file for tuning internals ph_config_load_config_file("/path/to/my/config.json"); // Enable the non-blocking IO manager ph_nbio_init(0); ph_log(PH_LOG_ERR, "will listen on `P{sockaddr:%p}", (void*)&addr); // This enables a very simple request/response console // that allows you to run diagnostic commands: // `echo memory | nc -UC /tmp/phenom-debug-console` // (on BSD systems, use `nc -Uc`!) // The code behind this is in // https://github.com/facebook/libphenom/blob/master/corelib/debug_console.c ph_debug_console_start("/tmp/phenom-debug-console"); lstn = ph_listener_new("echo-server", acceptor); ph_listener_bind(lstn, &addr); ph_listener_enable(lstn, true); // Run ph_sched_run(); return 0; }