#include <stdio.h> #include "my_sockets.h" #include "signals.h" void http_sigalrm_handler (int signo) { } int main (int argc, char *argv[]) { int sock, cr; struct sockaddr_in my_ip_address; unsigned long int ellapsed, size; char *response, buf[10000]; /* ================================================ */ /* Check the command line arguments */ /* ================================================ */ if (argc != 6) { fprintf (stderr, "\nUsage sockets.test <host name> <TCP port> <timeout (sec)> <timeout (micro)> <path to web document>\n"); return 1; } /* ================================================ */ /* Set dummy signal handler for SIGARLM */ /* ================================================ */ set_signal (SIGALRM); if (set_signal_handler(http_sigalrm_handler) == 1) { fprintf (stderr, "\nError: can not set signal handler!\n"); return 1; } /* ================================================ */ /* Open connection to the remote server */ /* ================================================ */ sock = open_tcp_connexion (&my_ip_address, argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), &ellapsed); switch (sock) { case SCK_CREATE_ERROR: { fprintf (stderr, "\nError: can not create the socket!\n"); return 1; }; break; case SCK_CONNECT_ERROR: { fprintf (stderr, "\nError: can not connect to the remote server!\n"); return 1; }; break; case SCK_GET_IP_ERROR: { fprintf (stderr, "\nError: DNS lookup failed!\n"); return 1; }; break; case SCK_TIMEOUT_CONNECT: { fprintf (stderr, "\nError: Timeout!\n"); return 1; }; break; case SCK_TIMER_ERROR: { fprintf (stderr, "\nError: high precision timer error!\n"); return 1; }; break; case SCK_CHRONO_ERROR: { fprintf (stderr, "\nError: high precision chrono error!\n"); return 1; }; break; default: fprintf (stdout, "\nConnection OK - ellapsed time for connect() : %lu ms\n", ellapsed); } /* ================================================ */ /* Send something */ /* ================================================ */ buf[0] = 0; strcat (buf, "GET "); strcat (buf, argv[5]); strcat (buf, " HTTP/1.0"); strcat (buf, "\nUser-Agent: ApacheBench"); strcat (buf, "\nHost: "); strcat (buf, "bench"); strcat (buf, "\nAccept: */*"); strcat (buf, "\012\015\012\015"); fprintf (stdout, "\nSending\n\n%s\n\n", buf); fflush (stdout); cr = write (sock, (void*)buf, strlen(buf)); if (cr == -1) { fprintf (stderr, "\nError: System call write() failed!\n"); return 1; } /* ================================================ */ /* Read server's response */ /* ================================================ */ cr = read_all_socket (sock, &response, atoi(argv[3]), atoi(argv[4]), &ellapsed, &size); switch (cr) { case SCK_READ_NO_MEM: { fprintf (stderr, "\nError: Program running out of memory!\n"); return 1; }; break; case SCK_READ_READ_ERROR: { fprintf (stderr, "\nError: System call read() failed!\n"); return 1; }; break; case SCK_READ_TIMEOUT: { fprintf (stderr, "\nError: Read timeout!\n"); return 1; }; break; case SCK_READ_CHRONO_ERROR: { fprintf (stderr, "\nError: high precision chrono error!\n"); return 1; }; break; default: { fprintf (stdout, "\nGet response - OK: response is [%s] (%lu bytes) - ellapsed time: %lu ms\n", response, size, ellapsed); free (response); } } /* ================================================ */ /* Disconnect and exit */ /* ================================================ */ close (sock); return 0; }