NETWATCH.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:4k
源码类别:

操作系统开发

开发平台:

DOS

  1. // Netwatch - watch a protocol in action
  2. //   acts as an intermediary between two programs
  3. //   eg.  TELNET -> netwatch -> TELNETD  to see the TELNET protocol in action
  4. //
  5. // NETWATCH  destserver  portnum
  6. // eg. NETWATCH sunserv  25   (25 is SMTP)
  7. // then telnet to your eRTOS machine to watch the protocol
  8. // Copies output to DUMP.DAT in current directory
  9. #include <stdio.h>
  10. #include <tcp.h>
  11. #include <rtos.h>
  12. #include <stdlib.h>
  13. void dumpdata( char *msg, char *data, int len )
  14. {
  15.     FILE *f;
  16.     int i;
  17.     f = fopen( "dump.dat", "a+t" );
  18.     cprintf( "%s %c", msg, (data != NULL) ? ':' : ' ');
  19.     if ( f != NULL )
  20.         fprintf( f, "%s %c" , msg, (data != NULL ) ? ':' : ' ');
  21.     for ( i = 0 ; i < len ; ++i ) {
  22.         cprintf("%c",data[i] );
  23.         if ( data != NULL )
  24.             fprintf(f,"%c", data[i] );
  25.     }
  26.     cprintf("rn");
  27.     if (data != NULL ) {
  28.         fprintf(f,"n");
  29.         fclose( f );
  30.     }
  31. }
  32. int main( int argc, char **argv )
  33. {
  34.     char *server;
  35.     DWORD serv;
  36.     int port;
  37.     int active = 0;
  38.     tcp_Socket *s, *t;
  39.     int closed;
  40.     int i,j;
  41.     char buf[ 128 ];
  42.     kdebug = 1;
  43.     rt_init(100);
  44.     sock_init();            /* initialize network */
  45.     // process arguments
  46.     if ( argc < 3 )
  47.         rt_halt("NETWATCH  server   protocol");
  48.     server = argv[1];
  49.     serv = resolve( server );
  50.     if ( serv == 0 )
  51.         rt_halt("could not resolve server");
  52.     port = atoi( argv[2] );
  53.     s = kcalloc( sizeof( tcp_Socket ), 1 );
  54.     t = kcalloc( sizeof( tcp_Socket ), 1 );
  55.     // ready for action
  56.     do {
  57.         if ( active ) {
  58.             cprintf("Freeing session ...rn");
  59.             sock_abort( s );
  60.             sock_abort( t );
  61.         }
  62.         cprintf("Listenning on port %u and relaying to %srn", port, server);
  63.         // start listenning
  64.         active = 0;
  65.         tcp_listen( s, port, 0L, 0, NULL, 0 );
  66.         while ( !sock_established( s )) {
  67.             rt_yield();
  68.             tcp_tick( s );
  69.         }
  70.         // got something
  71.         active = 1;
  72.         cprintf("client connection arrived");
  73.         if ( ! tcp_open( t, 0, serv, port, NULL ) ) {
  74.             cprintf("unable to connect to server");
  75.             continue;
  76.         }
  77.         while ( !sock_established( t )) {
  78.             tcp_tick( NULL );
  79.             rt_yield();
  80.         }
  81.         cprintf("connected to server: %srn", server );
  82.         // process all the data from either side
  83.         closed = 0;
  84.         do {
  85.             rt_yield();     // so we can break out
  86.             // look for closures
  87.             if ( !tcp_tick( s )) {
  88.                 if (( closed & 1 ) == 0 ) {
  89.                     cprintf("client broke connectionrn");
  90.                     closed |= 1;
  91.                     sock_close( t );
  92.                 }
  93.             }
  94.             if ( !tcp_tick( t )) {
  95.                 if (( closed & 2 ) == 0 ) {
  96.                     cprintf("server broke connectionrn");
  97.                     closed |= 2;
  98.                     sock_close( s );
  99.                 }
  100.             }
  101.             // have both parties quit?
  102.             if ( closed == 3 ) break;
  103.             if ( sock_dataready( s )) {
  104.                 i = sock_fastread( s, buf, sizeof( buf ));
  105.                 dumpdata("client ", buf, i );
  106.                 sock_write( t, buf, i );
  107.             }
  108.             if ( sock_dataready( t )) {
  109.                 i = sock_fastread( t, buf, sizeof( buf ));
  110.                 dumpdata("server ", buf, i );
  111.                 sock_write( s, buf, i );
  112.             }
  113.         } while ( 1 );
  114.     } while ( 1 );
  115. }