#include #include #include #include #include struct ctx { char *hostname; }; static void ping_fiber(void *ptr) { struct ctx *ctx = (struct ctx*) ptr; struct tf_sockaddr host; struct tf_fd fd; struct tf_timeout to; char buf[128]; int bytes = 0, r; const char *req = "GET / HTTP/1.0\r\n\r\n"; printf("Lookup %s\n", ctx->hostname); host.u.in.sin_family = AF_INET; host.u.in.sin_addr.s_addr = inet_addr(ctx->hostname); host.u.in.sin_port = htons(80); r = tf_socket(&fd, AF_INET, SOCK_STREAM, 0); if (r < 0) goto err; r = tf_timed(&to, tf_connect(&fd, &host), 10000); if (r < 0) goto err_close; r = tf_write_fully(&fd, req, strlen(req)); if (r < 0) goto err_close; while ((r = tf_read(&fd, buf, sizeof(buf))) > 0) bytes += r; err_close: tf_close(&fd); err: printf("Host: %s, received %d bytes (r=%d, %s)\n", ctx->hostname, bytes, -r, strerror(-r)); } int main(int argc, char **argv) { struct ctx *c; int i; tf_vmach_start(); for (i = 1; i < argc; i++) { c = tf_fiber_create(ping_fiber, sizeof(struct ctx)); c->hostname = argv[i]; tf_fiber_run(c); } tf_vmach_stop(); }