#include "stdAfx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include <time.h>

#define MAX_CLIENTS

SOCKET CreatServerSocket ( ) ;
int	StartServerSocket (SOCKET ssock);

int	main(int argc, char* argv[ ] )
{
WORD		wVer;
WSADATA	WsaData;
SOCKET		ServerSocket;

wver = MARKWORD (1,1);
if (WSAStartup(wVer, &WsaData) != 0)
{
	printf("WSAStartup( )  failed.\n");
	exit (1);
}

ServerSocket = CreateServerSocket ( );
if (ServerSocket == INVALID_SOCKET)
{
	printf(" failed to create server socket.\n");
	exit (1);
}

StartServer (ServerSocket);
WSACleanup( );
return 0;
}

SOCKET CreateServerSocket( )
{
SOCKET			sock;
struct sockaddr_in		saddr;

sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == INVALID_SOCKET;
{
	printf("socket ( ) failed.\n") ;
	return INVALID_SOCKET;
}

saddr.sin_family = AF_INET;
saddr.sin_port     = htons(4000);
saddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

if (bind(sock, (struct sockaddr *)&saddr, sizeof(saddr)) != 0)
{
	printf("bind( ) failed. \n");
	closesocket(sock);
	return INVALID_SOCKET;
}

if (listen(sock, 5) != 0)
{
	printf("listen ( ) failed\n");
	closesocket (sock);
	return INVALID_SOCKET;
}

printf("Server socket is now listening...\n");
return sock;
}

int StartServer(SOCKET ssock)
{
struct sockaddr_in		caddr;
int			clen;
SOCKET			csock,
			CurSock;

struct timeval		WaitTime;

fd_set			readset;
SOCKET			ClientSocket [MAX_CLIENTS];
int			Num1[MAX_CLIENTS],
			Num2[MAX_CLIENTS],
			NumClients;
int			data, i, j, ans,
			num_fd, nread;

NumClients = 0;
for (i = 0; i < MAX_CLIENTS; i++)
	ClientsSocket[i] = INVALID_SOCKET;

while(1)
{
	FD_ZERO(&readset);

	FD_SET(ssock, &readset);
	for(i = 0; i < NumClients; i++)
		FD_SET( ClientSocket [i], &readset);

	WaitTime.tv_sec 	= 1;
	WaitTime.tv_sec	= 0;

	num_fd = salect (0,	&readset,	 NULL,  NULL,  &WaitTime);

	if (num_fd <= 0)
		continue;

	if (FD_ISSET(ssock, &readset))
	{
		clen = sizeof(caddr);
		csock = accept (ssock,  (struct sockaddr *)&caddr, &clen);
		if(csock == INVALID_SOCKET)
		{
			printf("accept ( ) failed. try again. \n");
			continue;
		}

		ClientSocket [NumClients] = csock;
		Num1[NumClients] = Num2[NumClients] = -1;
		NumClients++;

		printf("Got a connection from %s as client #%d\n",
			inet_ntoa (caddr.sin_addr), NumClients);
	}
	for (i = 0; i < NumClients; i++)
	{
		CurSock = ClientSocket [i];

		if (FD_ISSET(CurSock, &readset))
		{
			nread = recv (CurSock,	(char *)&data, sizeof (int), 0);
			if (nread == SOCKET_ERROR)
				continue;
		else if (nread == 0)
		{
			printf("Client socket %d closed. \n",CurSock);

			closesocket (CurSock);
			
			ClientSocket [i] = INVALID_SOCKET;
		}
		else
		{

			if (Num [i] < 0)
			{
				printf("Got first data from client %d (%d) \n", i,data);
				Num [i] = data;
			}
			else if (Num2[i] < 0 )
			{
				printf("Got second data from client %d  (%d) \n", i, data);
				Num2 [i] = data;

				ans = Num1 [i] + Num2 [i];

				send(CurSock,   (char *)&ans, sizeof(int), 0);
				printf("answer sent to client %d (%d)\n", i, ans);
			}
			else
				printf("Got too many data from client socket &d\n", CurSock);
		}
	}
	}
	i = 0;
	while( i < MAX_CLIENTS)
	{
		while( i < MAX_CLIENTS && ClientSocket [i] != INVALID_SOCKET)
		i++;

		j = i+j;
		while( j < MAX_CLIENTS && ClientSocket [j] == INVALID_SOCKET)
			j++;

		if ( i < MAX_CLIENTS && j < MAX_CLIENTS)
		{
			printf("move clients index %d to %d\n", j, i);
			ClientSocket [i] = ClientSocket [j] ;
			ClientSocket [j] = INVALID_SOCKET;
		}
		i++;
	}

	NumClients = 0;
	for (i = 0; i <MAX_CLIENTS; i++)
		if(ClientSocket [i] != INVALID_SOCKET;
			NumClients++;
}
return 0;
}









 








	









		






































