#include "tcp.h"
#include "heartbeat.h"

int main( int argc, char **argv )
{
	fd_set afd;             /* wszystkie deskryptory */
	fd_set readfd;          /* deskryptory do czytania */
	msg_t msg;              /* wymieniany komunikat */
   int cnt = sizeof( msg );
	struct timeval tv;      /* czas */
	int s;                  /* deskryptor gniazda */
	int rc;                 /* liczba otrzymanych bajtów */
	int heartbeats = 0;     /* liczba wyslanych heartbeat */


   program_name=argv[0];

	s = tcp_client( argv[ 1 ], argv[ 2 ] );
	FD_ZERO( &afd );
	FD_SET( s, &afd );
   /* wyslij nastepny heartbeat po T1 */
	tv.tv_sec = T1;
	tv.tv_usec = 0;
	for ( ;; )
	{
		readfd = afd;
		rc = select( s + 1, &readfd, NULL, NULL, &tv );
		if ( rc < 0 )
			error( 1, errno, "select()" );
		if ( rc == 0 )		/* timeout, brak odpowiedzi */
		{
         /* Jesli zostaly wyslane > 3 heartbeat , brak polaczenia */
			if ( ++heartbeats > 3 )
				error( 1, 0, "brak polaczenia\n" );
			error( 0, 0, "wysylam heartbeat nr %d\n", heartbeats );
			msg.type = htonl( MSG_HEARTBEAT );
			rc = write( s, ( char * )&msg, sizeof( msg ));
			if ( rc < 0 )
				error( 1, errno, "write()" );
         /* ustawiam czas oczekiwania na odpowiedź */
			tv.tv_sec = T2;
			continue;
		}
		if ( !FD_ISSET( s, &readfd ) )
			error( 1, 0, "select() zwrocila niepoprawny deskryptor\n" );
		rc = read( s, ( char * )&msg + sizeof( msg ) - cnt, cnt);
		if ( rc == 0 )
			error( 1, 0, "serwer zakonczyl prace\n" );
		if ( rc < 0 )
			error( 1, errno, "read()" );
      /* nadeszla odpowiedz od serwera */
		heartbeats = 0;
		tv.tv_sec = T1;
		cnt -= rc;
		if ( cnt > 0 )
			continue;
		cnt = sizeof( msg );

		/* przetwrzanie właściwego komunikatu */
	}
}
