#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "socket.hpp"

#define serverName "localhost" // name of the server ot be connected to
#define portNumber 9000

// Helper macro for displaying errors
#define PRINTERROR(s) cprintf( "\n%: %d\n", s, WSAGetLastError() )

int socketClass::openConnection( char *name )
{
  int nRet;
  WORD wVersionRequested = MAKEWORD( 1,1 );
  WSADATA wsaData;

//
// Initialize WinSock and check the version
//
  nRet = WSAStartup( wVersionRequested, &wsaData );
  if ( wsaData.wVersion != wVersionRequested )
  {
    cprintf( "\n Wrong version\n" );
    return -1;
  }

//
// Create an UDP/IP datagram socket
//
  socketFD = socket( AF_INET,			// Address family
	                  SOCK_DGRAM,		// Socket type
		               IPPROTO_UDP );	// Protocol

  if ( socketFD == INVALID_SOCKET )
  {
    PRINTERROR( "socket()" );
    return -1;
  }

//
// Find the server
//
  LPHOSTENT lpHostEntry;

  lpHostEntry = gethostbyname( serverName );
  if ( lpHostEntry == NULL )
  {
    PRINTERROR( "gethostbyname()" );
    return -1;
  }


//
// Fill in the address structure for the server
//
  saServer.sin_family = AF_INET;
  saServer.sin_addr = *( (LPIN_ADDR)*lpHostEntry->h_addr_list );	// Server's address
  saServer.sin_port = htons( portNumber );	// Port number from command line

  char txt[255];
  sprintf( txt, "INIT %s", name );
  sendCommand( txt );

  return 0;
}


int socketClass::sendCommand( const char *data )
{
  int nRet;

  nRet = sendto(socketFD,				// Socket
					 data,				// Data buffer
		          strlen(data),			// Length of data
                0,				// Flags
		          (LPSOCKADDR)&saServer,		// Server address
		          sizeof(struct sockaddr)); 	// Length of address


  if (nRet == SOCKET_ERROR)
  {
    PRINTERROR("sendto()");
    closesocket(socketFD);
    return -1;
  }
}



	//
	// Wait for the reply
	//
int socketClass::receiveCommand( char data[255] )
{
  int nFromLen;
  int nRet;

  memset( data, 0, 255 );
  nFromLen = sizeof( struct sockaddr );
  recvfrom(socketFD,					   // Socket
   		 data,							// Receive buffer
			 255,					         // Length of receive buffer
			 0,								// Flags
			 (LPSOCKADDR)&saServer,		// Buffer to receive sender's address
			 &nFromLen);					// Length of address buffer

  if ( nRet == SOCKET_ERROR )
  {
   	PRINTERROR( "recvfrom()" );
		closesocket( socketFD );
		return -1;
  }
}
