#include "cli_parse.h" #include "server_udp_hub.h" static void udpserver_usage(FILE *out) { fprintf(out, "usage: udpserver [-listen addr] [-latency-log path] [-tx-ts-debug-log path]\n"); } int main(int argc, char **argv) { const char *listen_addr = ":9001"; const char *latency_log_path = ""; const char *tx_debug_log_path = ""; latency_logger_t *latency_logger = NULL; tx_timestamp_debug_logger_t *debug_logger = NULL; udp_hub_t *hub = NULL; int enable_timestamping = 0; int i; int rc = 1; for (i = 1; i < argc; ++i) { const char *value = NULL; int handled; if ((handled = cli_parse_value_flag(argc, argv, &i, argv[i], "-listen", &value)) < 0) { fprintf(stderr, "udpserver: flag -listen requires a value\n"); return 1; } else if (handled) { listen_addr = value; continue; } if ((handled = cli_parse_value_flag(argc, argv, &i, argv[i], "-latency-log", &value)) < 0) { fprintf(stderr, "udpserver: flag -latency-log requires a value\n"); return 1; } else if (handled) { latency_log_path = value; continue; } if ((handled = cli_parse_value_flag(argc, argv, &i, argv[i], "-tx-ts-debug-log", &value)) < 0) { fprintf(stderr, "udpserver: flag -tx-ts-debug-log requires a value\n"); return 1; } else if (handled) { tx_debug_log_path = value; continue; } if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { udpserver_usage(stdout); return 0; } fprintf(stderr, "udpserver: unknown argument %s\n", argv[i]); udpserver_usage(stderr); return 1; } if (latency_log_path[0] != '\0') { latency_logger = latencylog_open_jsonl(latency_log_path); if (latency_logger == NULL) { fprintf(stderr, "udpserver: open latency logger %s failed\n", latency_log_path); goto cleanup; } } if (tx_debug_log_path[0] != '\0') { debug_logger = tx_timestamp_debug_open_jsonl(tx_debug_log_path); if (debug_logger == NULL) { fprintf(stderr, "udpserver: open tx timestamp debug logger %s failed\n", tx_debug_log_path); goto cleanup; } enable_timestamping = 1; } hub = udp_hub_open(listen_addr, latency_logger, debug_logger, enable_timestamping); if (hub == NULL) { fprintf(stderr, "udpserver: listen on %s failed\n", listen_addr); goto cleanup; } fprintf(stderr, "udp server listening on %s\n", listen_addr); if (udp_hub_serve(hub) != 0) { fprintf(stderr, "udpserver: serve failed\n"); goto cleanup; } rc = 0; cleanup: udp_hub_free(hub); tx_timestamp_debug_close(debug_logger); latencylog_close(latency_logger); return rc; }