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 ); } }
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; }
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" ); } } } }
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 ); } }