#include <stdio.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <errno.h>

main(int argc, char **argv) {
   int maxconn=10;
   char *addr="127.0.0.1";
   int port=80;
   int sock;
   int conn, nbconn, nbconnok=0;
   struct sockaddr_in saddr;
   const int one = 1;

   if (argc < 4) {
     fprintf(stderr,"usage : %s <addr> <port> <nbconn> [1|2]\n",argv[0]);
     exit(1);
   }
   addr=argv[1];
   port=atoi(argv[2]);
   maxconn=atoi(argv[3]);
   for (nbconn=0; nbconn<maxconn; nbconn++) {
     sock=socket(AF_INET, SOCK_STREAM, 0);
     if (sock >= 0) {
        if (fcntl(sock, F_SETFL, O_NONBLOCK) == -1)
	 	perror("fcntl(O_NONBLOCK)");

        if (setsockopt(sock, SOL_TCP, TCP_NODELAY, &one, sizeof(one)) == -1)
		perror("setsockopt(TCP_NODELAY)");

        if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) == -1)
		perror("setsockopt(SO_REUSEADDR)");

        bzero(&saddr, sizeof(saddr));
        saddr.sin_addr.s_addr=inet_addr(addr);
        saddr.sin_port=htons(port);
        saddr.sin_family=AF_INET;
     }
     if (sock < 0 || (((conn=connect(sock,&saddr,sizeof(saddr))) < 0) && (errno != EINPROGRESS))) {
       fprintf(stderr,"ERROR: connect()=%d, nbconn=%d : ",conn,nbconn);
       perror("");
       usleep(300000);
     }
     else {
       nbconnok++;
       if (argc>4) {
         write(sock,"GET / HTTP/1.0\r\n",16);
	 if (*argv[4]=='2')
           write(sock,"\r\n",2);
       }
     }
     fprintf(stderr,"%d / %d \r",nbconnok,nbconn+1);
   }
   fprintf(stderr,"%d connections established.\nPress any key so exit.\n",nbconnok);
   getchar();
   exit(0);
}
