#include #include #include #include #include #include #include #include #include #include //シグナル利用のファイル #include #include //#include #include #include #include #include #include #define NO_DATA 0xffff #define DATA_MASK 0xff typedef unsigned char uchar ; #define TELNET_PORT 23 void* TelnetThread( void* arg ) ; char* GetCommand( int Socket ) ; int Sockprintf( int Socket, const char* fmt, ...) ; int Communication( int Socket ) ; char* strlwr( char* Buffer ) ; void ReadOut( int fd ) ; ushort GetDataTM( int fd ) ; uchar GetData( int fd ) ; int GetWaistMilliSec( struct timeval* Org ) ; ushort GetDataWithTimeOut( int fd, int MilliSec ) ; void Usage( int Socket ) ; int GetParameter( char* Buffer, int* Parameter ) ; void DispParameter( int Param[], int NumOfParam ) ; /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ int main(int argc, char * argv[]) { int new_sock, err ; struct timeval TimeOut ; struct sockaddr_in myaddr ; struct sockaddr_in client_addr ; socklen_t client_address_size ; int sock ; TimeOut.tv_sec = 5 ; TimeOut.tv_usec = 0 ; client_address_size = sizeof( client_addr ) ; sock = socket( AF_INET, SOCK_STREAM, 0 ) ; bzero( &myaddr, sizeof( myaddr ) ) ; myaddr.sin_family = AF_INET ; myaddr.sin_addr.s_addr = htonl( INADDR_ANY ) ; myaddr.sin_port = htons( TELNET_PORT ) ; err = bind( sock,(struct sockaddr* )&myaddr, sizeof( myaddr ) ) ; err = listen( sock, 2 ) ; printf( "listen=%d\n", err ) ; while( 1 ) { new_sock = accept( sock, (struct sockaddr* )&client_addr , &client_address_size ) ; if( new_sock < 0 ) { exit( -1 ) ; } if( Communication( new_sock ) != 0 ) { close( sock ) ; break ; } printf( "detach\n" ) ; } return( 0 ) ; } /****************************************************************************** 機能要約 telnet の応答 機能 引数 戻り値 注意 ******************************************************************************/ int Communication( int Socket ) { char* Buffer ; int ProgTerminate = 0 ; int Parameter[ 3 ] ; int NumOfParameter ; printf( "\nclient open port=%d\n",TELNET_PORT ) ; fflush( stdout ) ; //TimeOut 処理をするためにノンブロッキングモードにする fcntl( Socket, F_SETFL, O_NONBLOCK); while( 1 ) { Sockprintf(Socket, "Telnet>"); Buffer = GetCommand( Socket ) ; if( Buffer == NULL ) { break ; } strlwr( Buffer ) ; if( strncmp( Buffer, "led", 3 ) == 0 ) { NumOfParameter = GetParameter( Buffer, Parameter ) ; DispParameter( Parameter, NumOfParameter ) ; continue ; } if( strncmp( Buffer, "hlp", 3 ) == 0 ) { Usage( Socket ) ; continue ; } if( strncmp( Buffer, "adc", 3 ) == 0 ) { Sockprintf( Socket, "%d %d\n", 123,456); continue ; } if( strncmp( Buffer, "dsp", 3 ) == 0 ) { Sockprintf( Socket, "%d %d\n", 123,456); NumOfParameter = GetParameter( Buffer, Parameter ) ; DispParameter( Parameter, NumOfParameter ) ; continue ; } if( strncmp( Buffer, "ver", 3 ) == 0 ) { Sockprintf( Socket, "%s", "Ver1.00\r\n" ) ; continue ; } if( strncmp( Buffer, "trm", 3 ) == 0 ) { ProgTerminate = 1 ; break ; } if( strncmp( Buffer, "bye", 3 ) == 0 ) { break ; } Sockprintf( Socket, "error\n" ) ; } printf( "\nclient close\n" ) ; fflush( stdout ) ; close( Socket ) ; return( ProgTerminate ) ; } /****************************************************************************** 機能要約 パラメーターを得る 機能 引数 戻り値 注意 ******************************************************************************/ int GetParameter( char* Buffer, int* Parameter ) { int NumOfParameter = 0 ; Buffer += 3 ; for(; *Buffer != 0 ; Buffer ++ ) { if( isdigit( *Buffer ) ) { Parameter[ NumOfParameter ] = atoi( Buffer ) ; NumOfParameter ++ ; for(; *Buffer != 0 ; Buffer ++ ) { if( *Buffer == 0 ) { return( NumOfParameter ) ; } if( isdigit( *Buffer ) == 0 ) { break ; } } } } return( NumOfParameter ) ; } /****************************************************************************** 機能要約 パラメーターを表示する 機能 引数 戻り値 注意 ******************************************************************************/ void DispParameter( int Param[], int NumOfParam ) { int i ; for( i = 0 ; i < NumOfParam ; i ++ ) { printf( "%d:", Param[ i ] ) ; } printf( "\n" ) ; } /****************************************************************************** 機能要約 使いかたを表示 機能 引数 戻り値 注意 ******************************************************************************/ void Usage( int Socket ) { int i ; static const char* HowTo[] = { "commands are" "led" , "adc" , "dsp" , "ver" , "trm" , "bye" , NULL} ; for( i = 0 ; HowTo[ i ] != NULL ; i ++ ) { Sockprintf( Socket, "%s\n", HowTo[ i ] ) ; } } /****************************************************************************** 機能要約 コマンド文字列を受け取る 機能 引数 戻り値 注意 ******************************************************************************/ char* GetCommand( int Socket ) { uint uintData ; uchar Data ; static char Buffer[ 64 ] ; int BufPtr ; while( 1 ) { //頭のコントロールコード等を削除 uintData = GetDataWithTimeOut( Socket, 10000 ) ; if( uintData == NO_DATA ) { printf("first timeout\n"); return( NULL ) ; } if( uintData > ' ' ) { break ; } } BufPtr = 0 ; Data = uintData ; Buffer[ BufPtr ] = Data ; BufPtr ++ ; while( 1 ) { uintData = GetDataWithTimeOut( Socket, 1000 ) ; if( uintData == NO_DATA ) { printf("timeout\n"); return( NULL ) ; } Data = uintData ; if( Data < ' ' ) { Buffer[ BufPtr ] = 0 ; return( Buffer ) ; } Buffer[ BufPtr ] = Data ; BufPtr ++ ; if( BufPtr >= 64 ) { return( NULL ) ; } } } /****************************************************************************** 機能要約 ソケットに対し printf 機能 引数 戻り値 注意 ******************************************************************************/ int Sockprintf( int Socket, const char* fmt, ...) { static char Buffer[ 128 ] ; va_list argptr; int cnt; //return(0); va_start(argptr, fmt ); cnt = vsprintf( Buffer, fmt, argptr ) ; va_end(argptr); write( Socket, Buffer, strlen( Buffer ) ) ; //printf( "<" ) ; //fwrite( Buffer, cnt , 1, stdout); //printf( ">\n" ) ; return(cnt); } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ ushort GetDataTM( int fd ) { ushort Data ; Data = GetDataWithTimeOut( fd, 5000 ) ; return( Data ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ ushort GetDataWithTimeOut( int fd, int MilliSec ) { char buf[ 1 ] ; struct timeval tv ; ushort Data ; int res ; if( MilliSec == 0 ) { Data = GetData( fd ) ; return( Data & DATA_MASK ) ; } gettimeofday(&tv, NULL); while( 1 ) { res = read( fd, buf, 1 ) ; if( res <= 0 ) { //printf( "%d:", GetWaistMilliSec( &tv ) ) ; if( GetWaistMilliSec( &tv ) > MilliSec ) { return( NO_DATA ) ; } usleep( 1000 ) ; continue ; } Data = buf[ 0 ] ; Data &= DATA_MASK ; //printf( "%d data=%02x\n",res,Data);fflush( stdout ) ; return( Data ) ; } } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ uchar GetData( int fd ) { char buf[ 1 ] ; ushort Data ; int res ; while( 1 ) { res = read( fd, buf, 1 ) ; if( res <= 0 ) { //printf("[%d]",res); fflush( stdout); usleep( 1000 ) ; continue ; } Data = buf[ 0 ] ; Data &= DATA_MASK ; //printf( "%d data=%02x\n",res,Data); fflush( stdout ) ; return( Data ) ; } } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ int GetWaistMilliSec( struct timeval* Org ) { int MilliSecOrg, MilliSecNow ; int MilliSec ; struct timeval Now ; gettimeofday(&Now, NULL); MilliSec = ( Now.tv_sec - Org->tv_sec ) * 1000; MilliSecOrg = Org->tv_usec / 1000 ; MilliSecNow = Now.tv_usec / 1000 ; return( MilliSec + MilliSecNow - MilliSecOrg ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ char* strlwr( char* Buffer ) { char Data ; int i ; for( i = 0 ; Buffer[ i ] != 0 ; i ++ ) { Data = Buffer[ i ] ; if( ( 'A' <= Data ) && ( Data <= 'Z' ) ) { Data = Data - 'A' + 'a' ; Buffer[ i ] = Data ; } } return( Buffer ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void ReadOut( int fd ) { int ret ; ret= tcflush(fd, TCIFLUSH ) ; printf( "tcflush %d\n",ret); }