#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; 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(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)); } static void init_fiber(void *ptr) { struct tf_main_ctx *ctx = (struct tf_main_ctx *) ptr; struct ctx *c; int i; for (i = 1; i < ctx->argc; i++) { c = tf_fiber_create(ping_fiber, sizeof(struct ctx)); c->hostname = ctx->argv[i]; tf_fiber_put(c); } } int main(int argc, char **argv) { return tf_main_args(init_fiber, argc, argv); }