/* This program creates a tcp server process in the 
   internet domain, port is passed in as an arg */
/* to compile, add wsock32.lib to the list of
   libraries to link with in the project settings menu*/
#include<windows.h>
#include<stdio.h>
#include<winsock.h>

#define BUFSIZE 1024
char *msg = "I got your message";

void error(char *msg)
{
	printf("ERROR, %s, errno is %d\n",msg, WSAGetLastError());
	exit(0);
}

int main(int argc, char *argv[])
{
   SOCKET sock, newsock;
   int len, fromlen;
   DWORD n, retval;
   unsigned short port;
   struct sockaddr_in server;
   struct sockaddr_in from;
   char buffer[BUFSIZE];
   WORD version;
   WSADATA stWSAData;

   if (argc < 2) {
     fprintf(stderr,"usage %s portnumber\n",argv[0]);
     exit(0);
   }
   version = MAKEWORD(2,2);
   retval =WSAStartup(version,&stWSAData);
   if (retval != 0) error("WSAStartup");
   port = (unsigned short) atoi(argv[1]);
   sock=socket(AF_INET, SOCK_STREAM, 0);
   if (sock == INVALID_SOCKET) error("Opening socket");
   server.sin_family=AF_INET;
   server.sin_addr.s_addr=INADDR_ANY;
   server.sin_port=htons(port);  
   len=sizeof(server);
   if (bind(sock,
           (struct sockaddr *)&server, 
           len) != 0) 
        error("binding socket");
   fromlen=sizeof(from);
   listen(sock,5);
   while (1) {
        newsock=accept(sock,
                  (struct sockaddr *)&from, 
                  &fromlen);
        printf("A connection has been accepted\n");

            n = recv(newsock,buffer,BUFSIZE,0);
            if (n < 1) {
	        error("Reading from socket");
            }
             else {
	        buffer[n]='\0';
                printf("The message from %s is %s\n",
                  inet_ntoa(from.sin_addr),
                  buffer);
	     }
	     n = send(newsock, msg, strlen(msg),0);
	     if (n != strlen(msg)) error("Writing");
         closesocket(newsock); 
	}
   return 0; /* we never get here */
}
