#include "ServerWSA.h"
#include <stdio.h>

CServerWSA::CServerWSA(void)
{
	bytesRecv = SOCKET_ERROR;
	clearBuff();
}

CServerWSA::~CServerWSA(void)
{
}

// clear buffer
void CServerWSA::clearBuff(void)
{
	for(int i = 1;i<32;i++){
		sendbuf[i]=0;
		recvbuf[i]=0;
	}
}

// Initialize Winsock.
void CServerWSA::initializeWSA(void)
{
	WSADATA wsaData;
	int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );//initialize Windows Sockets API
	if ( iResult != NO_ERROR )
		printf("Error at WSAStartup()\n");
}

// Create a socket.
void CServerWSA::socketCreate(void)
{
	//tworzone jest gniazdo dla rodziny adresów (AdresFamily) sieci internet dla trybu
	//strumieniowego przesyłania danych), do obsługi tego trybu w seci internet służy protokół
	//TCP/IP (IPPROTO_TCP)
	m_socket = socket( AF_INET, SOCK_STREAM, 0 ); // tworzony jest socket
	if ( m_socket == INVALID_SOCKET ) { // obsługa błędu
		printf( "Error at socket(): %ld\n", WSAGetLastError() );
		WSACleanup();
		return;
	}
}

// Bind the socket.
void CServerWSA::bindSocket(unsigned short port){
    server_service.sin_family = AF_INET;
    server_service.sin_addr.s_addr = INADDR_ANY;
    server_service.sin_port = htons( port );
    if ( bind( m_socket, (SOCKADDR*) &server_service, sizeof(server_service) ) == SOCKET_ERROR ) {
        printf( "bind() failed.\n" );
        closesocket(m_socket);
        return;
    }
}

//send buffor
void CServerWSA::sendData(SOCKET client){
	//wysyła dane do gniazda serwera określonego przez m_socket z bufora sendbuff. Wysyłana
	//jest ilość bajtów podana przez strlen(sendbuf);

	int bytesSent = send(client, sendbuf, sizeof(sendbuf), 0 );
	printf( "Bytes Sent: %ld\n", bytesSent );

	
}

// Listen on the socket.
void CServerWSA::serverListen(){
    if ( listen( m_socket, 10 ) == SOCKET_ERROR )
        printf( "Error listening on socket.\n");
}

void CServerWSA::receiveData(SOCKET client){
	//Odebrane dane są zapisywane do bufora recbuf, którego maksymalny rozmiar jet określony
	//w wywołaniu funkcji recv. Ilość danych odczytanych jest zwracana do zmiennej bytesRecv
	bytesRecv = SOCKET_ERROR;
	while( bytesRecv == SOCKET_ERROR ) {
		bytesRecv = recv( client, recvbuf, 32, 0 );
		if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
			printf( "Connection Closed.\n");
			break;
		}
		if (bytesRecv < 0)
			return;
	printf( "Bytes Recv: %ld\n", bytesRecv );
	}
	
}