diff --git a/src/meas_lat.c b/src/meas_lat.c index cf1d2d4..f9e8c6f 100644 --- a/src/meas_lat.c +++ b/src/meas_lat.c @@ -6,6 +6,7 @@ #include #include "evt_core.h" #include "net_tools.h" +#include "socks5.h" struct measure_conf { uint64_t max_measure; @@ -101,12 +102,13 @@ int on_timer(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) { perror("clock_gettime error"); exit(EXIT_FAILURE); } - struct evt_core_fdinfo* udpinfo = evt_core_get_first_from_cat (ctx, "udp-read"); - if (udpinfo == NULL) { + struct evt_core_fdinfo* tgtinfo = evt_core_get_first_from_cat (ctx, "udp-read"); + if (tgtinfo == NULL) tgtinfo = evt_core_get_first_from_cat (ctx, "tcp-read"); + if (tgtinfo == NULL) { printf("No connection yet\n"); return 1; } - s = send(udpinfo->fd, mc->payload, mc->payload_size, 0); + s = send(tgtinfo->fd, mc->payload, mc->payload_size, 0); if (s < 0) { perror("Send error"); //exit(EXIT_FAILURE); @@ -121,6 +123,15 @@ void free_timer_conf(void* v) { } void register_categories(struct evt_core_ctx* evts) { + struct evt_core_cat tcp_read = { + .app_ctx = NULL, + .free_app_ctx = NULL, + .cb = on_udp, + .err_cb = on_udp_err, + .name = "tcp-read", + .flags = EPOLLIN | EPOLLET, + .socklist = NULL + }; struct evt_core_cat udp_read = { .app_ctx = NULL, .free_app_ctx = NULL, @@ -142,11 +153,55 @@ void register_categories(struct evt_core_ctx* evts) { evt_core_init(evts); evt_core_add_cat (evts, &udp_read); + evt_core_add_cat (evts, &tcp_read); evt_core_add_cat(evts, &timer); printf("--- Categories registered\n"); } +int register_tor_socket(struct evt_core_ctx* evts, char* host, char* port, int count, int size) { + int socks5_sock = -1, err = 0; + for (int i = 30; i > 0; i--) { + sleep(2); + printf("Try %d/30 to connect to %s:%s\n", i, host, port); + if (socks5_sock >= 0) { + close(socks5_sock); + socks5_sock = -1; + } + socks5_sock = create_tcp_client ("127.0.0.1", "9050"); + err = socks5_handshake_syn (socks5_sock); + if (err < 0) continue; + err = socks5_handshake_ack (socks5_sock); + if (err < 0) continue; + err = socks5_connect_dns (socks5_sock, host, atoi(port)); + if (err < 0) continue; + err = socks5_reply (socks5_sock); + if (err < 0) { + fprintf(stderr, "Socks5 error %s\n", socks5_rep(-err)); + continue; + } + else break; + } + if (socks5_sock < 0 || err < 0) { + exit(EXIT_FAILURE); + } + + char url[1024]; + struct evt_core_cat cat = {0}; + struct evt_core_fdinfo fdinfo = {0}; + fdinfo.cat = &cat; + fdinfo.url = url; + + fdinfo.fd = socks5_sock; + fdinfo.cat->name = "tcp-read"; + fdinfo.other = create_measure_conf (count, size); + fdinfo.free_other = free_mesure_conf; + sprintf(fdinfo.url, "tcp:read:%s:%s", host, port); + evt_core_add_fd (evts, &fdinfo); + printf("--- Tor socket registered\n"); + return fdinfo.fd; +} + int register_udp_socket(struct evt_core_ctx* evts, char* host, char* port, int count, int size) { int udp_sock = create_udp_client (host, port); char url[1024]; @@ -206,25 +261,28 @@ int main(int argc, char** argv) { printf("~ measlat ~\n"); int opt, udp_fd, count = 0, size = 0, interval = 0; - char *host = NULL, *port = NULL; + char *host = NULL, *port = NULL, *transport = NULL; struct evt_core_ctx evts = {0}; // 1. Parse parameters - while ((opt = getopt(argc, argv, "h:p:c:s:i:")) != -1) { + while ((opt = getopt(argc, argv, "h:p:c:s:i:t:")) != -1) { switch(opt) { - case 'h': + case 'h': // host host = optarg; break; - case 'p': + case 'p': // port port = optarg; break; - case 'c': + case 't': // transport + transport = optarg; + break; + case 'c': // count count = atoi(optarg); break; - case 's': + case 's': // size - payload in bytes size = atoi(optarg); break; - case 'i': + case 'i': // interval - every ms interval = atoi(optarg); break; default: @@ -237,11 +295,13 @@ int main(int argc, char** argv) { if (interval <= 0) interval = 1000; if (count <= 0) count = 1; if (size < header_size) size = header_size; + if (transport == NULL) transport = "udp"; if (host == NULL || port == NULL) goto usage; // 3. Bind events register_categories(&evts); - udp_fd = register_udp_socket(&evts, host, port, count, size); + if (strcmp(transport, "udp") == 0) udp_fd = register_udp_socket(&evts, host, port, count, size); + else if (strcmp(transport, "tor") == 0) udp_fd = register_tor_socket(&evts, host, port, count, size); register_timer(&evts, udp_fd, interval, count, size); // 4. Run main loop @@ -249,6 +309,6 @@ int main(int argc, char** argv) { return 0; usage: - fprintf(stderr, "Usage: %s -h -p [-c ] [-i ] [-s ]\n", argv[0]); + fprintf(stderr, "Usage: %s -h -p [-t ] [-c ] [-i ] [-s ]\n", argv[0]); exit(EXIT_FAILURE); }