int TCPSocketWindows::OpenTCPSocket(void)
{
	CloseTCPSocket();
	
	hSocket = socket(AF_INET, SOCK_STREAM, 0);
	if(hSocket == INVALID_SOCKET) {
		return -1;
	}

	SOCKADDR_IN tcp_sock_addr;

	memset(&tcp_sock_addr, 0, sizeof(tcp_sock_addr));
	tcp_sock_addr.sin_family = AF_INET;
	tcp_sock_addr.sin_addr.s_addr = inet_addr(ip.c_str());
	tcp_sock_addr.sin_port = htons((short)port);

	if(connect(hSocket, (SOCKADDR *)&tcp_sock_addr, sizeof(tcp_sock_addr)) == SOCKET_ERROR) {
		CloseTCPSocket();
		return -1;
	}

	int opt_timeout = timeOut;

	if(setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&opt_timeout, sizeof(opt_timeout)) == SOCKET_ERROR) {
		CloseTCPSocket();
		return -1;
	}

	if(setsockopt(hSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&opt_timeout, sizeof(opt_timeout)) == SOCKET_ERROR) {
		CloseTCPSocket();
		return -1;
	}
	
	return 0;
}
Example #2
0
/*------------------------------------------------------------------------------------------------------------*/
void cgi_reset( void * pStruct )
{
	struct HTTP_REQUEST * http_request;
	http_request = (struct HTTP_REQUEST *) pStruct;

	cgi_PrintHttpheaderStart();

	if ( http_request->argc == 0 )
	{
		printf_P( PSTR(	"<form action=\"reset.cgi\" method=\"get\" accept-charset=\"ISO-8859-1\">"
						"<p><input type=\"submit\" name=\"reset\" value=\"reset\"></p></form>" ));
		cgi_PrintHttpheaderEnd();
	}
	else if( PharseCheckName_P( http_request, PSTR("reset") ) )
	{	
		if ( !strcmp_P( http_request->argvalue[ PharseGetValue_P( http_request, PSTR("reset") ) ] , PSTR("reset") ) )
		{
			printf_P( PSTR("Reset"));
			cgi_PrintHttpheaderEnd();
			STDOUT_Flush();
			CloseTCPSocket( http_request->HTTP_SOCKET );
			softreset();
			while(1);
		}
	}
}
int TCPSocketWindows::SetParameter(string ip, short port, unsigned long timeOut)
{
	CloseTCPSocket();

	this->ip = ip;
	this->port = port;
	this->timeOut = timeOut;

	return OpenTCPSocket();
}
/*------------------------------------------------------------------------------------------------------------*/
void mp3client_stopstreaming( void )
{
	timer0_stop();
	// stream offen ?
	if ( MP3_SOCKET != NO_SOCKET_USED )
		CloseTCPSocket ( MP3_SOCKET );

	// Meldung ausgeben
	printf_P( PSTR("Connection closed.\r\n") );
	
	// MP3-Puffer leeren
	Flush_FIFO( MP3_FIFO );

	printf_P( PSTR("FIFO flushed.\r\n") );
	
	STDOUT_Flush();
	
	// socket ungültig setzen
	MP3_SOCKET = NO_SOCKET_USED;
}
int main(int argc, char *argv[])
{
    int done = FALSE;
    opterr = 0;

    //fprintf(stderr, "ctrack started.");
    c_control = C_RUN;

    srand((int)time(NULL));

	ErrorInit();    
    ConfigInit(); // initializes verbose; must be called before any output

   	ReadConfig(TRUE); // default loc.
    TorrentDBCreate();

    unsigned int p;
    while (!done) {
        switch (getopt(argc, argv, "+vqVhrdt:u:p:c:"))  { // + means "don't shuffle args"
            case '?': // invalid option
                PrintSyntax(1);
            case 'h': // help option
                PrintSyntax(0);
            case 'V':
            	printf("ctrack " VERSION "\n");
            	return 0;
                break;
            case 'v':
                SetConfigBool(CFG_VERBOSE, TRUE);
                log("Verbose mode");
                break;
            case 'q':
                SetConfigBool(CFG_VERBOSE, FALSE);
                log("Quiet mode");
                break;
            case 't':
                if (b_assign(atoi(optarg),1,65535,(int *)&p))
                    SetConfigUInt(CFG_HTTP_PORT, p);
                break;
            case 'u':
                if (b_assign(atoi(optarg),1,65535,(int *)&p))
                    SetConfigUInt(CFG_UDP_PORT, p);
                break;
            case 'p':
                if (b_assign(atoi(optarg),1,65535,(int *)&p))
                    SetConfigUInt(CFG_SERVER_PORT, p);
                break;
            case 'd':
                SetConfigBool(CFG_DAEMON, TRUE);
                break;
            case 'c': //config file
	            SetConfigString(CFG_CONFIG_FILE, optarg);
                ReadConfig(FALSE);
            	break;
            case -1:  //end of options
                done = TRUE;
                break;
            default:
                PrintSyntax(1);
                break;    
        }//switch
    }//while
    int i;
    for (i = optind; i < argc; i++) {
    	PTorrentInfo t;
    	char ibuffer[20];
    	if (strtohash(argv[i], ibuffer)) {
			NewTorrentInfo(&t, ibuffer);
		} else {
			errorm("Invalid hash: %s", argv[i]);
		}
    }//for

    //TODO:parse args
    //TODO:init torrent db

#ifdef DAEMON_SUPPORT
    if (GetConfigBool(CFG_DAEMON) == TRUE) {
    /* Our process ID and Session ID */
    pid_t pid, sid;

    /* Fork off the parent process */
    pid = fork();
    if (pid < 0) { exit(EXIT_FAILURE); }
    /* If we got a good PID, then we can exit the parent process. */
    if (pid > 0) { exit(EXIT_SUCCESS); }
    /* Change the file mode mask */
    umask(0);
        /* Create a new SID for the child process */
    sid = setsid();
    if (sid < 0) {
		errorm("setsid() failed: %s", str_error());
		exit(EXIT_FAILURE);
    }
    /* Change the current working directory */
    if ((chdir("/")) < 0) {
		errorm("chdir() failed: %s", str_error());
        exit(EXIT_FAILURE);
    }
    /* Close out the standard file descriptors */
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

	if (daemon(TRUE, FALSE) != 0) 
        errorf(E_SYSTEM, "daemon() failed: %S", str_error());
    } else {
		extern int asdaemon;
		asdaemon = TRUE;
    }
#endif

    //SetupSignalHandlers
	sigset_t set;
	int sig;

    while (c_control == C_RUN) {
    	sigfillset(&set);
    	pthread_sigmask(SIG_SETMASK, &set, NULL);

        if (GetConfigBool(CFG_HTTP_SERVER)) { // HTTP server
	        if (SetUpListener())
    	        HTTPThreadInit();
	    }

	    if (GetConfigBool(CFG_UDP_SERVER)) { // UDP server
	        UDPThreadInit();
	    }

		//TODO: sigwait
		while (c_control == C_RUN) {
		    sigwait(&set, &sig);
			logf("Caught signal #%d", sig);
			switch (sig) {
				case SIGINT:
	                c_control = C_TERMINATE;
    	            log("Exitting...");
        	        break;
				case SIGHUP:
	                c_control = C_RESTART;
	                log("Restarting...");
                   	ReadConfig(FALSE);
	                break;
				case SIGSEGV:
	                c_control = C_TERMINATE;
    	            log("Exitting...");
			}//switch
		}//while
        ThreadsDestroy();
    	CloseTCPSocket();
    	CloseUDPSocket();

        if (c_control == C_RESTART) { c_control = C_RUN; }
    }//while

  	log("exit ");
    return ((sig==SIGINT) ? EXIT_SUCCESS : EXIT_FAILURE);
}
TCPSocketWindows::~TCPSocketWindows(void)
{
	CloseTCPSocket();

	WSACleanup();
}
Example #7
0
/*------------------------------------------------------------------------------------------------------------*/	
void telnet_thread()
	{
		static struct TELNET_SESSION telnet_session;
		struct STDOUT oldstream;
		char Data; 
		int i;
		
		// keine alte Verbindung offen?
		if ( telnet_session.SOCKET == NO_SOCKET_USED )
		{ 	
			// auf neue Verbindung testen
			telnet_session.SOCKET = CheckPortRequest( TELNET_PORT );
			if ( telnet_session.SOCKET != NO_SOCKET_USED )
			{	
				STDOUT_save( &oldstream );
				STDOUT_set( _TCP, telnet_session.SOCKET );
				// Wenn ja, Startmeldung ausgeben und startzustand herstellen für telnet
				printf_P( PSTR( "Welcome on Tiny-Telnetserver 0.2!\r\n"
								"Und, los geht's...!!! (\"help\" hilft :-))\r\n> " ));
				STDOUT_restore( &oldstream );

				// TELNET_BUFFER leeren und auf Ausgangszustand setzen
				telnet_session.STATE = 0;
				telnet_session.POS = 0;
				telnet_session.BUFFER[0] = '\0';
				telnet_session.STATE = 0;
				
				FlushSocketData( telnet_session.SOCKET );
			}
		}
		// Wenn alte Verbindung offen hier weiter:
		else
		{
			// checken, ob noch offen ist
			if( CheckSocketState( telnet_session.SOCKET ) == SOCKET_NOT_USE )
			{
				CloseTCPSocket( telnet_session.SOCKET );
				telnet_session.SOCKET = NO_SOCKET_USED;
				return;
			}

			// Auf neue Daten zum zusammenbauen testen
			// hier wird der TELNET_BUFFER aufgefüllt bis 0x0a oder 0x0d eintreffen. der Puffer ist statisch
			// Wenn ein 0x0a oder 0x0d empfangen wurde, wird der TELNET_STATE auf 1 gesetzt, damit er verarbeitet werden kann
			if ( telnet_session.STATE == 0 )
			{	
				
				while( GetBytesInSocketData( telnet_session.SOCKET ) >= 1 )
				{
					Data = ( GetByteFromSocketData ( telnet_session.SOCKET ) );
					if ( Data != 0x0a && Data <= 0x7f)
					{
						if ( telnet_session.POS < TELNET_BUFFER_LEN )
						{
							telnet_session.BUFFER[ telnet_session.POS++ ] = Data;
							telnet_session.BUFFER[ telnet_session.POS ] = '\0';
						}
						if ( Data == 0x0d )
						{
							telnet_session.STATE = 1;
							break;
						}
					}
				}
			}	

			// Wenn TELNET_BUFFER eine Zeile vollständig hat gehts hier weiter
			if ( telnet_session.STATE == 1 )
			{

				STDOUT_save( &oldstream );
				STDOUT_set( _TCP, telnet_session.SOCKET );

				telnet_session.argc = TELNET_pharse( telnet_session.BUFFER, telnet_session.argv, MAX_ARGC );
				TELNET_runcmd( telnet_session.argc, telnet_session.argv );

				// auf QUIT checken
				if ( !strcmp_P( telnet_session.argv[ 0 ] , PSTR("quit") ) ) 
				{
					// Socket schließen
					printf_P( PSTR("Verbindung wird geschlossen\r\n") );
					STDOUT_Flush();
					STDOUT_set( RS232, 0);
					CloseTCPSocket( telnet_session.SOCKET );
					telnet_session.SOCKET = NO_SOCKET_USED;
					return;
				}
				else if( !strcmp_P( telnet_session.argv[ 0 ] , PSTR("help") ) )
				{
					printf_P( PSTR("Folgende Befehle sind vorhanden:\r\n\r\n") );
					for( i = 0 ; i < MAX_TELNET_ENTRYS ; i++ )
					{
						if ( telnet_cmd_table[ i ].functionname != NULL )
						{
							printf_P( telnet_cmd_table[ i ].functionname );
							printf_P( PSTR("\r\n") );
						}
					}
				}

				printf_P( PSTR("> ") );
				
				STDOUT_restore( &oldstream );

				telnet_session.STATE = 0;
				telnet_session.POS = 0;
				telnet_session.BUFFER[0] = '\0';
				telnet_session.STATE = 0;
			}
		}
	}
Example #8
0
/**
 * \brief Der Telnet-client an sich. Er wird zyklisch aufgerufen und schaut nach ob eine Verbindung auf den
 * registrierten Port eingegangen ist. Wenn ja holt er sich die Socketnummer der Verbindung und speichert diese.
 * Wenn eine Verbindung zustande gekommen ist wird diese wiederrum zyklisch nach neuen Daten abgefragt und entsprechend
 * reagiert.
 * \param 	NONE
 * \return	NONE
 */
void telnet_thread( void )
{
	struct STDOUT oldstream;
	char Data; 
	
	// keine alte Verbindung offen?
	if ( telnet_session.SOCKET == NO_SOCKET_USED )
	{ 	
		// auf neue Verbindung testen
		telnet_session.SOCKET = CheckPortRequest( TELNET_PORT );
		if ( telnet_session.SOCKET != NO_SOCKET_USED )
		{	
			STDOUT_save( &oldstream );
			STDOUT_set( _TCP, telnet_session.SOCKET );
			// Wenn ja, Startmeldung ausgeben und startzustand herstellen für telnet
			printf_P( PSTR( "Und, los geht's...!!! (\"help\" hilft :-))\r\n> " ));
			STDOUT_restore( &oldstream );

			// TELNET_BUFFER leeren und auf Ausgangszustand setzen
			telnet_session.STATE = 0;
			telnet_session.POS = 0;
			telnet_session.BUFFER[0] = '\0';
			telnet_session.STATE = 0;

			FlushSocketData( telnet_session.SOCKET );
		}
	}
	// Wenn alte Verbindung offen hier weiter:
	else
	{
		// checken, ob noch offen ist
		if( CheckSocketState( telnet_session.SOCKET ) != SOCKET_READY )
		{
			telnet_session.SOCKET = NO_SOCKET_USED;
			return;
		}

		// Auf neue Daten zum zusammenbauen testen
		// hier wird der TELNET_BUFFER aufgefüllt bis 0x0a oder 0x0d eintreffen. der Puffer ist statisch
		// Wenn ein 0x0a oder 0x0d empfangen wurde, wird der TELNET_STATE auf 1 gesetzt, damit er verarbeitet werden kann
		if ( telnet_session.STATE == 0 )
		{	

			while( GetBytesInSocketData( telnet_session.SOCKET ) >= 1 )
			{
				Data = ( GetByteFromSocketData ( telnet_session.SOCKET ) );
				if ( Data != 0x0a && Data <= 0x7f)
				{
					if ( telnet_session.POS < TELNET_BUFFER_LEN )
					{
						telnet_session.BUFFER[ telnet_session.POS++ ] = Data;
						telnet_session.BUFFER[ telnet_session.POS ] = '\0';
					}
					if ( Data == 0x0d )
					{
						telnet_session.STATE = 1;
						break;
					}
				}
			}
		}	

		// Wenn TELNET_BUFFER eine Zeile vollständig hat gehts hier weiter
		if ( telnet_session.STATE == 1 )
		{

			STDOUT_save( &oldstream );
			STDOUT_set( _TCP, telnet_session.SOCKET );

			telnet_session.argc = SHELL_pharse( telnet_session.BUFFER, telnet_session.argv, MAX_ARGC );

			// auf QUIT checken
			if ( !strcmp_P( telnet_session.argv[ 0 ] , PSTR("quit") ) ) 
			{
				// Socket schließen
				printf_P( PSTR("Quiting\r\n") );
				STDOUT_Flush();
				STDOUT_set( RS232, 0);
				CloseTCPSocket( telnet_session.SOCKET );
				telnet_session.SOCKET = NO_SOCKET_USED;
				return;
			} else 
			/************************************************************************/
			/* help value for openhab just intended to simulate a connection        */
			/************************************************************************/
			if(!strcmp_P( telnet_session.argv[ 0 ] , PSTR("value") )){
				printf_P( PSTR("openhab") );
				STDOUT_Flush();
			}
			else
			{
				SHELL_runcmd( telnet_session.argc, telnet_session.argv );
			}

			printf_P( PSTR("> ") );

			STDOUT_restore( &oldstream );

			telnet_session.STATE = 0;
			telnet_session.POS = 0;
			telnet_session.BUFFER[0] = '\0';
			telnet_session.STATE = 0;
		}
	}
}
/*------------------------------------------------------------------------------------------------------------*/
void mp3client_stream( void )
{
	static unsigned int temp;
	char sreg_tmp;

	
	timer0_stop();
	
	// Wenn slowstart auf 0 steht Decoder nicht befüttern, sonst warten bis 7/8 voll
	if ( slowstart == 0 )
		VS10xx_flush_from_FIFO( MP3_FIFO );
	else
		if ( Get_Bytes_in_FIFO ( MP3_FIFO ) > ( mp3_buffer_size / 8 ) * 7 ) slowstart = 0;
	
	// Verbindung wirklich noch offen
	if( CheckSocketState( MP3_SOCKET ) == SOCKET_NOT_USE )
	{
		CloseTCPSocket( MP3_SOCKET );
		MP3_SOCKET = NO_SOCKET_USED;
	}
	else
	{
		sreg_tmp = SREG;
		sei();
		
		// Datenpuffer auffrischen mit neuen daten von TCP-Verbindung
		while ( GetBytesInSocketData( MP3_SOCKET ) >= MP3TCPtranslen && Get_FIFOrestsize ( MP3_FIFO ) > MP3TCPtranslen && metainfolen == 0 )
		{
			// Wenn die transferlänge zum nächsten Metaint kleiner als translen zwischen tcp und mp3 buffer ist, nur diese
			// kopieren damit danach der metaint eingelesen werden kann
			if ( metaint - ( metaintcounter%metaint ) < MP3TCPtranslen && metaint != 0)
			{
				LED_on(1);
				temp = GetSocketDataToFIFO ( MP3_SOCKET, MP3_FIFO, metaint - ( metaintcounter%metaint ) );
				totalbytes = totalbytes + temp;
				metaintcounter = metaintcounter + temp;
				LED_off(1);
			}
			else
			{	
				LED_on(1);
				temp = GetSocketDataToFIFO ( MP3_SOCKET, MP3_FIFO, MP3TCPtranslen );
				totalbytes = totalbytes + temp;
				metaintcounter = metaintcounter + temp;
				LED_off(1);
			}
			
			if ( metaintcounter%metaint == 0 && metaint != 0 )
			{
				// checkt und wartet ob mehr als 1 Byte im Puffer ist
				while ( GetBytesInSocketData( MP3_SOCKET ) <= 0 );
				// lese Byte und errechne die metalänge
				metainfolen = GetByteFromSocketData ( MP3_SOCKET ) * 16 ;
				
				break;
			}
		}

		SREG = sreg_tmp;
	}
	
	timer0_free();

}
Example #10
0
/*------------------------------------------------------------------------------------------------------------*/
void mp3client_thread( void )
{
	#define bandwidthhis	16
	unsigned char i;
	static unsigned long totalbytesold[bandwidthhis],bandwidth;
	static unsigned char y;	
	static unsigned int temp;
	timer0_stop();
	
	STDOUT_Set_RS232 ();
	
	if ( MP3_SOCKET == NO_SOCKET_USED )
	{ 	
		// keine Verbindung offen? Trafficcounter zurücksetzen
		y=0;
		metaintcounter=0;
		slowstart = 1;
	}
	else
	{	
		// Verbindung wirklich noch offen
		if( CheckSocketState( MP3_SOCKET ) == SOCKET_NOT_USE )
		{
			CloseTCPSocket( MP3_SOCKET );
			MP3_SOCKET = NO_SOCKET_USED;
		}
		else
		{		
			// Wenn Puffer auf unter 1/8 gelaufen ist slowstart setzen 
			if ( Get_Bytes_in_FIFO ( MP3_FIFO ) < mp3_buffer_size / 8 ) slowstart = 1;			
		
/*			// Datenpuffer auffrischen mit neuen daten von TCP-Verbindung
			while ( GetBytesInSocketData( MP3_SOCKET ) >= MP3TCPtranslen && Get_FIFOrestsize ( MP3_FIFO ) > MP3TCPtranslen && metainfolen == 0 )
			{
				// Wenn die transferlänge zum nächsten Metaint kleiner als translen zwischen tcp und mp3 buffer ist, nur diese
				// kopieren damit danach der metaint eingelesen werden kann
				if ( metaint - ( metaintcounter%metaint ) < MP3TCPtranslen && metaint != 0)
				{
					LED_on(1);
					temp = GetSocketDataToFIFO ( MP3_SOCKET, MP3_FIFO, metaint - ( metaintcounter%metaint ) );
					totalbytes = totalbytes + temp;
					metaintcounter = metaintcounter + temp;
					LED_off(1);
				}
				else
				{	
					LED_on(1);
					temp = GetSocketDataToFIFO ( MP3_SOCKET, MP3_FIFO, MP3TCPtranslen );
					totalbytes = totalbytes + temp;
					metaintcounter = metaintcounter + temp;
					LED_off(1);
				}
				
				if ( metaintcounter%metaint == 0 && metaint != 0 )
				{
					// checkt und wartet ob mehr als 1 Byte im Puffer ist
					while ( GetBytesInSocketData( MP3_SOCKET ) <= 0 );
					// lese Byte und errechne die metalänge
					metainfolen = GetByteFromSocketData ( MP3_SOCKET ) * 16 ;
					
					break;
				}
    		}
*/			
			// Wenn der metaintcounter auf einen metaint steht, den metaint lesen und ausgeben
			if ( metainfolen != 0 )
			{						
				mp3client_readmetainfo( MP3_SOCKET, metainfolen );
				metainfolen = 0;
			}

			// Counter schon bei 0, wenn ja stats updaten
			if ( CLOCK_GetCountdownTimer ( mp3timer ) == 0 )
			{			
				bandwidth = 0;	

				// traffic aufaddieren
				for ( i = 0 ; i < bandwidthhis ; i++)
					bandwidth = bandwidth + totalbytesold[ i ];	
	
				// bandwidth berechnen alle 0,5 sekunden
				bandwidth = ( bandwidth / bandwidthhis ) * 2;
				
				// stats sichern
				mp3clientupdate( bandwidth, GetBytesInSocketData( MP3_SOCKET ) , Get_Bytes_in_FIFO ( MP3_FIFO ), VS10xx_get_decodetime( ), verboselevel );		

				// wenn verboselevel gesetzt ausgeben
				if ( verboselevel != 0)
					printf_P( PSTR("\r%5d(TCP %4d)Bytes on FIFO, bandwidth:%3ldkbit/s(%2dkb/s)"), Get_Bytes_in_FIFO ( MP3_FIFO ), GetBytesInSocketData( MP3_SOCKET ), ( bandwidth * 8 ) / 1024, ( bandwidth * 8 ) / 8192 );	

				// zähler für bandwidth zurücksetzten
				if ( y < bandwidthhis )
				{
					totalbytesold[y] = totalbytes;
				}
				else
				{
					y = 0;
					totalbytesold[y] = totalbytes;
				}
				y++;
				totalbytes = 0;	

				// Counter neu starten 0,5 Sekunden
				CLOCK_SetCountdownTimer ( mp3timer, 47, MSECOUND );
			}
		}
	}
	
	timer0_free();
	return;
}
Example #11
0
/* Download CEPT-Hypertext Page from Ulm */
int applicationBtxHttpGet(char *url, unsigned long ulmIp ,char *data, int *status)
{
	volatile unsigned int httpServerSocket = NO_SOCKET_USED;
	char dataByte;
	char *dataPointer = data;
	unsigned char timeoutTimerHandle;
	int dataCount = 0;							/* Counter to prevent buffer overflows */

	/* Pass 1: Establish server connection */
	httpServerSocket = Connect2IP(ulmIp,BTX_ULM_PORT);			/* Connect http-server (Ulm) */

	if(httpServerSocket == NO_SOCKET_USED)
		return -1;							/* Connection failed */

	/* Pass 2: Perform HTTP-Request */
	STDOUT_Set_TCP_Socket(httpServerSocket);
	printf_P(PSTR("GET %s HTTP/1.0\r\nHost: " BTX_ULM_HOST "\r\n\r\n"),url);
	STDOUT_Flush();

	if(httpServerSocket == NO_SOCKET_USED)
		return -1;							/* Connection closed unexpectetly */

	timeoutTimerHandle = CLOCK_RegisterCoundowntimer();			/* Register timer */

	while(GetBytesInSocketData(httpServerSocket) == 0);			/* Trigger on incoming data */

	while(GetBytesInSocketData(httpServerSocket) > 0)
	{

		dataByte = GetByteFromSocketData(httpServerSocket);

		if(dataCount < BTX_CEPT_HYPERTEXT_BUFFERSIZE-1)
		{
			*dataPointer = dataByte;
			dataPointer++;
			dataCount++;
		}

		/* Handle connection timeout (3 retrys) */
		if(GetBytesInSocketData(httpServerSocket) == 0)
		{
			CLOCK_SetCountdownTimer (timeoutTimerHandle, 8, MSECOUND );
			while(CLOCK_GetCountdownTimer(timeoutTimerHandle) > 0);

			if(GetBytesInSocketData(httpServerSocket) == 0)
			{
				CLOCK_SetCountdownTimer (timeoutTimerHandle, 16, MSECOUND );
				while(CLOCK_GetCountdownTimer(timeoutTimerHandle) > 0);

				if(GetBytesInSocketData(httpServerSocket) == 0)
				{
					CLOCK_SetCountdownTimer (timeoutTimerHandle, 32, MSECOUND );
					while(CLOCK_GetCountdownTimer(timeoutTimerHandle) > 0);

					if(GetBytesInSocketData(httpServerSocket) == 0)
						break;
				}
			}
		}
		
	}

	CLOCK_ReleaseCountdownTimer(timeoutTimerHandle);	/* Free timer */

	*dataPointer = '\0';					/* Add a 0 to make the string functions happy */
	*status = atoi(&data[8]);				/* Calculate status code */

	CloseTCPSocket (httpServerSocket);			/* Close connection */

	STDOUT_Set_RS232();					/* Set STDOUT to console */
	return 0;
}