#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define PORT             5555
#define MESSAGE         "Yow!!! Are we having fun yet?!?"
#define SERVERHOST      "localhost"


void write_to_server (int filedes)
{
   int nbytes;

   nbytes = write (filedes, MESSAGE, strlen (MESSAGE) + 1);
   if (nbytes < 0) {
       perror ("write");
       exit (EXIT_FAILURE);
   }
}


int main (void)
{
   struct timeval tv;
   fd_set fds;
   int sock, oldstate, curstate, r, err;
   int optlen = sizeof(int);
   struct sockaddr_in servername;

   /* Create the socket. */
   sock = socket (PF_INET, SOCK_STREAM, 0);
   if (sock < 0) {
       perror ("socket (client)");
       exit (EXIT_FAILURE);
   }

   oldstate = fcntl(sock, F_GETFL);
   curstate = oldstate | O_NONBLOCK;
   r = fcntl(sock, F_SETFL, curstate);
   if (r < 0) {
       perror("fcntl");
       exit(1);
   }

   /* Connect to the server. */
   init_sockaddr (&servername, SERVERHOST, PORT);
   if (0 > connect (sock, (struct sockaddr *) &servername,
       sizeof (servername))) {
       perror ("connect (client)");
   }

   FD_ZERO(&fds);
   FD_SET(sock, &fds);
   tv.tv_sec = 5;
   tv.tv_usec = 0;

   r = select(sock + 1, NULL, &fds, NULL, &tv);
   while (1) {
       if (FD_ISSET(sock, &fds)) {
           getsockopt(sock, SOL_SOCKET, SO_ERROR, (char*)&err, &optlen);
           if (err != 0) {
               perror("getsockopt");
           }
           break;
       }
       if (r <= 0) {
           if (r < 0)
               perror("select");
           else {
               printf("Timeout %d\n", r);
           }
       }
   }

   /* Send data to the server. */
   write_to_server (sock);
   close (sock);
   exit (EXIT_SUCCESS);
}