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

操作系统开发

开发平台:

DOS

  1. /*
  2.  * listens to network Routing Information Protocol traffic to find a list of
  3.  * routers/gateways on this subnet
  4.  * - an example of the sock_recv() functions
  5.  * - by default, udp_open() only stores the last read UDP packet for a port
  6.  * - use sock_recv() if you expect fast UDP replies, such as from a variety
  7.  *   of sources, it stores multiple packets in a queue
  8.  */
  9. #include <stdio.h>
  10. #include <rtos.h>
  11. #include <net.h>
  12. #define ROUTED_PORT 520
  13. #define BIG_BUF_SIZE 8192
  14. /* The following structures define RIP, routing information protocol */
  15. typedef struct {
  16.     BYTE cmd;
  17.     BYTE ver;
  18.     WORD mbz;
  19. } rip_head;
  20. typedef struct {
  21.     WORD addressfamily;
  22.     WORD mbz;
  23.     DWORD addr;
  24.     DWORD mbz2;
  25.     DWORD mbz3;
  26.     DWORD metric;
  27. } rip_data;
  28. void routed_thread( DWORD dummy )
  29. {
  30.     udp_Socket *u;
  31.     char *bigbuf;
  32.     char dgram[ 1024 ];
  33.     char buffer[ 32 ];
  34.     int templen;
  35.     int i, count;
  36.     DWORD hisip;
  37.     WORD hisport;
  38.     rip_data *rd;
  39.     if ( ( bigbuf = kcalloc( BIG_BUF_SIZE, 1 )) == NULL )
  40.         rt_halt("out of memory allocating buffer");
  41.     /* allocate structure */
  42.     if ( ( u = kcalloc( sizeof( tcp_Socket ), 1 )) == NULL )
  43.         rt_halt("out of memory allocating UDP structure ");
  44.     /* set up socket */
  45.     if ( !udp_open( u, ROUTED_PORT, 0xffffffff, 0xffff, NULL ))
  46.         rt_halt("error openning udp socketrn");
  47.     /* indicate to use the big buffer to queue datagrams */
  48.     if ( sock_recv_init( u, bigbuf, BIG_BUF_SIZE ) == -1 )
  49.         rt_halt("error assigning buffer spacern");
  50.     do {
  51.         tcp_tick( NULL );   /* process network stuff */
  52.         /* get the latest datagram */
  53.         while ( templen = sock_recv_from( u, &hisip, &hisport, dgram,
  54.                     sizeof(dgram),0)) {
  55.             inet_ntoa(buffer, intel(hisip));
  56.             cprintf("Got packet of %u bytes from %srn", templen, buffer);
  57.             /* determine number of elements by packet size */
  58.             count = (templen - sizeof( rip_head )) / sizeof( rip_data );
  59.             /* cycle through each */
  60.             for ( i = 0 ; i < count ; ++i ) {
  61.                 rd = (rip_data*)
  62.                         ( dgram + sizeof( rip_head ) + (i * sizeof( rip_data  )));
  63.                 cprintf("   advertising : %s ...rn", inet_ntoa( buffer, intel(rd->addr)));
  64.             }
  65.         }
  66.         rt_sleep(10);
  67.     } while ( 1 );
  68. }
  69. int main( int argc, char **argv )
  70. {
  71.     kdebug = 1;
  72.     rt_init(100);
  73.     sock_init();            /* initialize network */
  74.     rt_timerfreq( 100 );
  75.     cputs("starting...waiting for incoming RIP/UDP packetsrn");
  76.     cputs("often it will be several seconds before you receive anyrn");
  77.     cputs("Press the space bar to exitrn");
  78.     rt_newthread( routed_thread, 0, 4096, 0, "routed_thread" );
  79.     do {
  80.         /* nothing */
  81.         rt_yield();
  82.     } while ( 1 );
  83. }