|  | @@ -8,6 +8,7 @@
 | 
	
		
			
				|  |  |  #include <arpa/inet.h>
 | 
	
		
			
				|  |  |  #include <sys/types.h>  
 | 
	
		
			
				|  |  |  #include "Stream.h" 
 | 
	
		
			
				|  |  | +#include "SocketUtils.h"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void serverInitDefaults(Server* s)
 | 
	
		
			
				|  |  |  {
 | 
	
	
		
			
				|  | @@ -156,33 +157,41 @@ void* clientHandler(void* data)
 | 
	
		
			
				|  |  |      Stream in;
 | 
	
		
			
				|  |  |      while(1)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        streamInit(&in);
 | 
	
		
			
				|  |  | -        int size = recv(s->clientSockets[id], in.data, in.size, 0);
 | 
	
		
			
				|  |  | +        streamInit(&in, 1024);
 | 
	
		
			
				|  |  | +        int size = receiveAll(s->clientSockets[id], &in);
 | 
	
		
			
				|  |  |          if(size > 0)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            int package = ((int) in.data[0]);
 | 
	
		
			
				|  |  | -            if(package >= 0 && package < s->hIndex)
 | 
	
		
			
				|  |  | +            char package;
 | 
	
		
			
				|  |  | +            if(streamGetChar(&in, &package) == -1)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                printf("Received package %d from %d\n", package, id);
 | 
	
		
			
				|  |  | -                in.index = 1;
 | 
	
		
			
				|  |  | -                in.size = size;
 | 
	
		
			
				|  |  | -                s->handlers[package](&in);
 | 
	
		
			
				|  |  | +                printf("Invalid package %d from %d\n", (int) package, id);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              else
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                printf("Invalid package %d from %d\n", package, id);
 | 
	
		
			
				|  |  | +                if(package >= 0 && package < s->hIndex)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    printf("Received package %d from %d\n", (int) package, id);
 | 
	
		
			
				|  |  | +                    s->handlers[(int) package](&in);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                else
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    printf("Invalid package %d from %d\n", (int) package, id);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          else if(size == 0)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              printf("Client %d closed remote socket\n", id);
 | 
	
		
			
				|  |  | +            streamRemove(&in);
 | 
	
		
			
				|  |  |              break;
 | 
	
		
			
				|  |  |          }   
 | 
	
		
			
				|  |  |          else
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              perror("recv error");
 | 
	
		
			
				|  |  | +            streamRemove(&in);
 | 
	
		
			
				|  |  |              break;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        streamRemove(&in);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      if(close(s->clientSockets[id]) != 0)
 | 
	
	
		
			
				|  | @@ -201,7 +210,7 @@ void* clientHandler(void* data)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  int serverSend(int clientSocket, Stream* out)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -    if(send(clientSocket, out->data, out->index, 0) == -1)
 | 
	
		
			
				|  |  | +    if(sendAll(clientSocket, out) == -1)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          perror("Cannot send data");
 | 
	
		
			
				|  |  |          return -1;
 | 
	
	
		
			
				|  | @@ -240,10 +249,11 @@ void serverWaitForConnection(Server* s)
 | 
	
		
			
				|  |  |                          perror("Cannot create thread");  
 | 
	
		
			
				|  |  |                          
 | 
	
		
			
				|  |  |                          Stream out;
 | 
	
		
			
				|  |  | -                        streamInit(&out);
 | 
	
		
			
				|  |  | +                        streamInit(&out, 16);
 | 
	
		
			
				|  |  |                          streamWriteChar(&out, -1);
 | 
	
		
			
				|  |  |                          streamWriteChars(&out, "Cannot create thread\n");
 | 
	
		
			
				|  |  |                          serverSend(clientSocket, &out);
 | 
	
		
			
				|  |  | +                        streamRemove(&out);
 | 
	
		
			
				|  |  |                          close(clientSocket);
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      else
 | 
	
	
		
			
				|  | @@ -251,7 +261,7 @@ void serverWaitForConnection(Server* s)
 | 
	
		
			
				|  |  |                          s->clientSockets[i] = clientSocket;
 | 
	
		
			
				|  |  |                          
 | 
	
		
			
				|  |  |                          Stream out;
 | 
	
		
			
				|  |  | -                        streamInit(&out);
 | 
	
		
			
				|  |  | +                        streamInit(&out, 64);
 | 
	
		
			
				|  |  |                          streamWriteChar(&out, 1);
 | 
	
		
			
				|  |  |                          streamWriteChars(&out, "Welcome to the server, please enter your command:\n");
 | 
	
		
			
				|  |  |                          if(serverSend(clientSocket, &out) == -1)
 | 
	
	
		
			
				|  | @@ -260,6 +270,7 @@ void serverWaitForConnection(Server* s)
 | 
	
		
			
				|  |  |                              close(clientSocket);
 | 
	
		
			
				|  |  |                              s->clientSockets[i] = -1;
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  | +                        streamRemove(&out);
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      break;
 | 
	
		
			
				|  |  |                  }
 | 
	
	
		
			
				|  | @@ -270,10 +281,11 @@ void serverWaitForConnection(Server* s)
 | 
	
		
			
				|  |  |                      printf("max clients reached\n");    
 | 
	
		
			
				|  |  |                      
 | 
	
		
			
				|  |  |                      Stream out;
 | 
	
		
			
				|  |  | -                    streamInit(&out);
 | 
	
		
			
				|  |  | +                    streamInit(&out, 16);
 | 
	
		
			
				|  |  |                      streamWriteChar(&out, -1);
 | 
	
		
			
				|  |  |                      streamWriteChars(&out, "the server is full\n");
 | 
	
		
			
				|  |  |                      serverSend(clientSocket, &out);
 | 
	
		
			
				|  |  | +                    streamRemove(&out);
 | 
	
		
			
				|  |  |                      close(clientSocket);
 | 
	
		
			
				|  |  |                      break;
 | 
	
		
			
				|  |  |                  }
 |