コード例 #1
0
ファイル: TestNetServer.c プロジェクト: LucidOne/Rovio
void do_client_write( CLIENT_T *client )
{
	/* Write the integers to client. */
	if ( client->io_length < client->total_length )
	{
		int length_write;
		int length =  client->total_length - client->io_length;
		//diag_printf( "About write %d bytes at position %d\n", length, client->io_length );
		errno = 0;
		length_write = my_write( client->fd, (char *)&client->buffer + client->io_length, length );
		if ( length_write < 0 )
		{
			if ( errno == EWOULDBLOCK || errno == EAGAIN || errno == EINTR )
			{
				diag_printf( "Write return %d with errno = %d\n", length_write, errno );
				return;			/* request blocked at the pipe level, but keep going */
			}
			else
			{
				diag_printf( "error in writing client\n" );
				client_uninit( client );
				return;
			}
		}
		else if (length_write == 0 )
		{
			diag_printf( "Close by peer\n");
			client_uninit( client );
			return;
		}
		else 
		{
			//diag_printf( "Acturally send %d bytes\n", length_write );
			client->io_length += length_write;
		}
	}
	
	if ( client->io_length >= client->total_length )
	{
		//diag_printf( "write finished\n" );
		//client_uninit( client );
		client_init_for_read( client );
	}
}
コード例 #2
0
MainWindow::~MainWindow()
{
    client_uninit();
    if(!threadList->isEmpty()){
        qDebug()<<threadList->length();
        for(int i=0;i<threadList->length();i++)
        {
//            threadList->at(i)->quit();
            threadList->at(i)->terminate();
//            qDebug()<<1;
        }
//        qDebug()<<threadList->at(0)->isRunning()<<"2";
    }
    delete ui;
}
コード例 #3
0
ファイル: TestNetServer.c プロジェクト: LucidOne/Rovio
void WirelessTest_Test_Entry( cyg_addrword_t arg )
{
	int i;
	int fd_listen;
	int fd_max;
	fd_set r_set;
	fd_set w_set;
	
	WIRELESS_TEST_T *thread_cfg = (WIRELESS_TEST_T *)arg;
	srand( time( 0 ) );
	
	
	/* Clear the fd_array. */
	for ( i = 0; i < sizeof( thread_cfg->fd_array ) / sizeof( thread_cfg->fd_array[0] ); i++ )
	{
		thread_cfg->fd_array[i].fd			= -1;
	}
	
	/* The listening socket. */
	fd_listen = thread_cfg->fd_listen;
		
	/* Do select loop */
	while ( 1 )
	{
		FD_ZERO( &r_set );
		FD_ZERO( &w_set );
	
		/* Update fd_set */
		FD_SET( fd_listen, &r_set );
		fd_max = fd_listen;
		for ( i = 0; i < sizeof( thread_cfg->fd_array ) / sizeof( thread_cfg->fd_array[0] ); i++ )
		{
			if ( thread_cfg->fd_array[i].fd != -1 )
			{
				if ( thread_cfg->fd_array[i].state == CLIENT_WRITE )
				{
					if ( client_io_time_is_expired( &thread_cfg->fd_array[i] ) )
					{
diag_printf( "connection timeout, clean client\n" );						
						client_uninit( &thread_cfg->fd_array[i] );
					}
					else
					{
//diag_printf( "Add write set, fd = %d, state = %d\n", thread_cfg->fd_array[i].fd, thread_cfg->fd_array[i].state );
						FD_SET( thread_cfg->fd_array[i].fd, &w_set );
					}
				}
				else if ( thread_cfg->fd_array[i].state == CLIENT_READ )
				{
					if ( client_io_time_is_expired( &thread_cfg->fd_array[i] ) )
					{
diag_printf( "connection timeout, clean client\n" );						
						client_uninit( &thread_cfg->fd_array[i] );
					}
					else
					{
//diag_printf( "Add read set, fd = %d, state = %d\n", thread_cfg->fd_array[i].fd, thread_cfg->fd_array[i].state );
						FD_SET( thread_cfg->fd_array[i].fd, &r_set );
					}
				}
	
				if ( fd_max < thread_cfg->fd_array[i].fd )
					fd_max = thread_cfg->fd_array[i].fd;
			}
		}
		
		
	
		if ( ( select(fd_max + 1, &r_set, &w_set, NULL, NULL ) ) == -1 )
		{
			diag_printf( "select error\n" );
			continue;
		}
		
		/* Process each clients */
		for ( i = 0; i < sizeof( thread_cfg->fd_array ) / sizeof( thread_cfg->fd_array[0] ); i++ )
		{
			if ( thread_cfg->fd_array[i].fd != -1 )
			{
				if ( FD_ISSET( thread_cfg->fd_array[i].fd, &w_set )
				  || FD_ISSET( thread_cfg->fd_array[i].fd, &r_set) )
				{
					client_io_time_reset( &thread_cfg->fd_array[i] );
					do_client( &thread_cfg->fd_array[i] );
				}
			}
		}
		
		/* Check listening fd. */
		if ( FD_ISSET( fd_listen, &r_set ) )
		{
			int fd = accept_client( fd_listen );
			for ( i = 0; i < sizeof( thread_cfg->fd_array ) / sizeof( thread_cfg->fd_array[0] ); i++ )
			{
				if ( thread_cfg->fd_array[i].fd == -1 )
					break;
			}
			
			if ( i < sizeof( thread_cfg->fd_array ) / sizeof( thread_cfg->fd_array[0] ) )
			{
				client_init( &thread_cfg->fd_array[i], fd );
				diag_printf( "Init thread_cfg->fd_array[%d].fd = %d %d\n", i, fd, thread_cfg->fd_array[i].fd);
			}
			else
			{
				close( fd );
				diag_printf( "No fd slot available!\n" );
			}
		}
		
		
		
	}
}
コード例 #4
0
ファイル: TestNetServer.c プロジェクト: LucidOne/Rovio
void do_client_read( CLIENT_T *client )
{
	/* Read the integers number firstly. */
	if ( client->io_length < sizeof( int ) )
	{
		int length_read;
		int length = sizeof( int ) - client->io_length;
		//diag_printf( "About read %d bytes at position %d\n", length, client->io_length );
		errno = 0;
		length_read = my_read( client->fd, (char *)&client->buffer + client->io_length, length );
		if ( length_read < 0 )
		{
			if (errno == EWOULDBLOCK || errno == EAGAIN || errno == EINTR )
			{
				diag_printf( "Read return %d with errno = %d\n", length_read, errno );
				return;			/* request blocked at the pipe level, but keep going */
			}
			else
			{
				diag_printf( "error in reading client\n" );
				client_uninit( client );
				return;
			}
		}
		else if (length_read == 0 )
		{
			diag_printf( "Close by peer\n");
			client_uninit( client );
			return;
		}
		else
		{
			//diag_printf( "Acturally read %d bytes\n", length_read );
			client->io_length += length_read;
		}

		if ( client->io_length >= sizeof( int ) )
		{
			if ( client->buffer.number > MAX_INT_NUM )
			{
				diag_printf( "Too long client data\n" );
				client_uninit( client );
				return;
			}
			client->total_length = sizeof( client->buffer.number ) + client->buffer.number * sizeof( int );
		}	
	}
	/* Read the integers. */
	else if ( client->io_length < client->total_length )
	{
		int length_read;
		int length = client->total_length - client->io_length;
		
		//diag_printf( "About read %d bytes at position %d\n", length, client->io_length );
		length_read = my_read( client->fd, (char *)&client->buffer + client->io_length, length );
		if ( length_read < 0 )
		{
			if (errno == EWOULDBLOCK || errno == EAGAIN || errno == EINTR )
				return;			/* request blocked at the pipe level, but keep going */
			else
			{
				diag_printf( "error in reading client\n" );
				client_uninit( client );
				return;
			}
		}
		else if (length_read == 0 )
		{
			diag_printf( "Close by peer\n");
			client_uninit( client );
			return;
		}
		else
		{
			//diag_printf( "Acturally read %d bytes\n", length_read );
			client->io_length += length_read;
		}
	}
	
	if ( client->io_length >= client->total_length )
	{
		int i;
		//diag_printf( "Read finished\n" );
		
		/* Check the read buffer. */
		for ( i = 0; 0 && i < client->buffer.number; i++ )
		{
			if ( client->buffer.digit[i] != i )
			{
				diag_printf( "The read buffer is not correct!\n" );
				client_uninit( client );
				while( 1 );	//Block here
			}
		}
	
		
		
		client_init_for_write( client );
	}
}