#include <windows.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
   WSADATA wsd;
   int rc;
   struct timeval tv = { 1, 0 };
   fd_set fdread, fdwrite, fdexcep;

   rc = WSAStartup(MAKEWORD(2,0), &wsd);
   if (rc != 0) {
     printf("WSAStartup failed: %d", rc);
     return 1;
   } 

   int fd = socket(AF_INET, SOCK_DGRAM, 0);
   if (fd < 0) {
     printf("Error in socket call: %d", WSAGetLastError());
     return 1;
   }
   
   FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep);
   FD_SET(fd, &fdread); FD_SET(fd, &fdwrite); FD_SET(fd, &fdexcep);

   rc = select(fd + 1, &fdread, &fdwrite, &fdexcep, &tv);
   printf ("rc = %d\n", rc);
   printf ("readable? %s\n", FD_ISSET(fd, &fdread) ? "yes" : "no");
   printf ("writable? %s\n", FD_ISSET(fd, &fdwrite) ? "yes" : "no");
   printf ("exception? %s\n", FD_ISSET(fd, &fdexcep) ? "yes" : "no");

   FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep);
   FD_SET(fd, &fdread);

   rc = select(fd + 1, &fdread, &fdwrite, &fdexcep, &tv);
   printf ("rc = %d\n", rc);
   printf ("readable? %s\n", FD_ISSET(fd, &fdread) ? "yes" : "no");

   FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep);
   FD_SET(fd, &fdwrite);

   rc = select(fd + 1, &fdread, &fdwrite, &fdexcep, &tv);
   printf ("rc = %d\n", rc);
   printf ("writable? %s\n", FD_ISSET(fd, &fdwrite) ? "yes" : "no");
 
   FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep);
   FD_SET(fd, &fdexcep);

   rc = select(fd + 1, &fdread, &fdwrite, &fdexcep, &tv);
   printf ("rc = %d\n", rc);
   printf ("exception? %s\n", FD_ISSET(fd, &fdexcep) ? "yes" : "no");

   rc = select(0, NULL, NULL, NULL, &tv);
   printf ("rc = %d\n", rc);

   FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep);
   rc = select(0, &fdread, &fdwrite, &fdexcep, &tv);
   printf ("rc = %d\n", rc);

   sockaddr_in dest, name;
   int namelen;

   rc = getsockname(fd, (sockaddr*)&name, &namelen);
   printf ("getsockname rc = %d\n", rc);

   dest.sin_family = AF_INET;
   dest.sin_port = 1217;
   dest.sin_addr.s_addr = inet_addr("127.0.0.1");

   rc = sendto(fd, "A", 1, 0, (SOCKADDR *)&dest, sizeof(dest));
   printf ("sendto rc = %d\n", rc);

   rc = getsockname(fd, (sockaddr *)&name, &namelen);
   printf ("getsockname rc = %d\n", rc);

   return 0;
}

