home *** CD-ROM | disk | FTP | other *** search
/ Network Support Encyclopedia 96-1 / novell-nsepro-1996-1-cd2.iso / download / netware / tliex2.exe / DCLIENT.C next >
C/C++ Source or Header  |  1994-09-07  |  5KB  |  214 lines

  1. /* ************************************************************************ */
  2. /* DCLIENT.C
  3.  
  4.    This example is the client side of a simple TLI example.  In this example,
  5.    a simple message string is sent by the client, received by the server,
  6.    and sent back to the client.  The client compares the information sent
  7.    back, and then terminates.
  8.  
  9.    This example can be found in  the NetWare Programmers Guide for C, under
  10.    the TLI Services section.
  11.                                         */
  12. /* ************************************************************************ */
  13.  
  14. #define     INCL_BASE
  15. #define     INCL_DOS
  16. #define        INCL_VIO
  17. #include <os2.h>
  18.  
  19. #include <stdlib.h>
  20. #include <stdio.h>
  21. #include <ctype.h>
  22. #include <fcntl.h>
  23. #include <malloc.h>
  24. #include <string.h>
  25.  
  26. #define TLIINT  short
  27. #define TLIUINT unsigned short
  28.  
  29.  
  30. #define NWOS2
  31.  
  32. #define IS32BIT
  33. #define BCPP
  34.  
  35. #include <nwcaldef.h>
  36. #include <tispxipx.h>
  37. #include <tiuser.h>
  38.  
  39.  
  40. #define         SPX_SOCKET              4646       /* arbitrary socket */
  41. #define         SPX_BUF                 100        /* Buffer Size */
  42.  
  43. int  ParseAddress( char *address, IPX_ADDR *destination );
  44. int  PutAddress( char *string, char *buf, TLIINT hexBytes );
  45. void SPXDisconReason( TLIINT fd );
  46.  
  47. int ParseAddress( char *addr, IPX_ADDR *destination )
  48. {
  49.     if ( strlen( addr ) == 21 && addr[ 8 ] == '/' )
  50.         if ( PutAddress( addr, destination->ipxa_net, 4 ) )
  51.              if ( PutAddress( &addr[ 9 ], destination->ipxa_node, 6 ) )
  52.             return 1;
  53.     return 0;
  54. } /* ParseAddress */
  55.  
  56. int PutAddress( char *string, char *buf, TLIINT hexBytes )
  57. {
  58.     TLIINT   i, j, value;
  59.     char   c;
  60.  
  61.     for ( i = 0; i < hexBytes; i++ )
  62.     {
  63.         value = 0;                  /* build a byte from two nibbles */
  64.         for ( j = 0; j < 2; j++ )
  65.         {
  66.             value <<= 4;
  67.             if ( ( c = toupper( *string ) ) >= '0' && c <= '9')
  68.                 value += c - '0';
  69.             else if ( c >= 'A' && c <= 'F' )
  70.                 value += c - 'A' + 10;
  71.             else
  72.                 return 0;
  73.             string++;
  74.         }
  75.         *buf++ = value;
  76.     }
  77.     return 1;
  78. } /* PutAddress */
  79.  
  80. struct t_call tcall;
  81. int flags;
  82. char buf1[ SPX_BUF ];
  83. char buf2[ SPX_BUF ];
  84.  
  85. void main ( TLIINT argc, char *argv[] )
  86. {
  87.     IPX_ADDR spx_addr;               /* server address from command line */
  88.     SPX_OPTS spx_options;
  89.     TLIINT fd, i1;
  90.  
  91.     /* Step 1 */
  92.     if ( argc != 2 || !ParseAddress( argv[ 1 ], &spx_addr ) )
  93.     {
  94.       printf( "Usage:\tdclient          ServerAddress\n" );
  95.       printf( "\tServerAddress = Net/Node (in hex, leading zero's required)\n" );
  96.       printf( "\tExample:\"dclient 00001234/00001b02362e\"\n" );
  97.       exit( 1 );
  98.     }
  99.  
  100.     /* Step 2 */
  101.     if (( fd = t_open( "/dev/nspx", O_RDWR, ( struct t_info * )0) ) == -1 )
  102.     {
  103.         t_error( "open of /dev/nspx failed" );
  104.         exit( 2 );
  105.     }
  106.                   /* No need to bind to a specific socket */
  107.     if ( t_bind( fd, ( struct t_bind * )0, ( struct t_bind * )0 )== -1 )
  108.     {
  109.         t_error( "bind failed" );
  110.         exit( 2 );
  111.     }
  112.  
  113.     /* Step 3 */
  114.     spx_addr.ipxa_socket[ 0 ] = 0;
  115.     spx_addr.ipxa_socket[ 1 ] = SPX_SOCKET;
  116.     tcall.addr.buf = ( char * )&spx_addr;
  117.     tcall.addr.len = sizeof( spx_addr );
  118.     tcall.addr.maxlen = sizeof( spx_addr );
  119.     spx_options.spx_connectionID[ 0 ] = 0;
  120.     spx_options.spx_connectionID[ 1 ] = 0;
  121.     spx_options.spx_allocationNumber[ 0 ] = 0;
  122.     spx_options.spx_allocationNumber[ 1 ] = 0;
  123.     tcall.opt.buf = ( char * )&spx_options;
  124.     tcall.opt.len = sizeof( spx_options );
  125.     tcall.opt.maxlen = sizeof( spx_options );
  126.     tcall.udata.buf = ( char * )0;
  127.     tcall.udata.len = 0;
  128.     tcall.udata.maxlen = 0;
  129.  
  130.     /* Step 4 */
  131.     if ( t_connect( fd, &tcall, &tcall ) == -1 )
  132.     {
  133.         t_error( "t_connect failed" );
  134.         if ( t_errno == TLOOK && t_look( fd ) == T_DISCONNECT )
  135.             SPXDisconReason( fd );
  136.         exit( 2 );
  137.     }
  138.     printf( "t_connect successful, beginning send loop\n" );
  139.  
  140.     /* Step 5 */
  141.     for ( i1 = 0; i1 < 10; i1++ )
  142.     {
  143.         sprintf( buf1, "message %d", i1 );
  144.         if ( t_snd( fd, buf1, strlen( buf1 ) + 1, 0 ) == -1 )
  145.         {
  146.             t_error( "t_snd failed" );
  147.             exit( 2 );
  148.         }
  149.         printf( "Sent message '%s'\n", buf1 );
  150.         flags = 0;
  151.         if ( t_rcv( fd, buf2, SPX_BUF, &flags ) == -1 )
  152.         {
  153.             t_error( "t_rcv failed" );
  154.             printf( "t_errno = %d, t_look() = %d\n",t_errno,t_look(fd));
  155.             if ( t_errno == TLOOK && t_look( fd ) == T_DISCONNECT )
  156.             SPXDisconReason( fd );
  157.             exit( 2 );
  158.         }
  159.         if ( strcmp( buf1, buf2 ) == 0 )
  160.             printf( "Received message '%s'\n", buf2 );
  161.         else
  162.         {
  163.             printf( "Received back invalid message %s\n", buf2 );
  164.             t_close( fd );
  165.             exit( 3 );
  166.         }
  167.     }
  168.  
  169.     /* Step 6 */
  170.     if ( t_snddis( fd, ( struct t_call * )0 ) == -1 )
  171.     {
  172.         t_error( "t_snddis failed" );
  173.         exit( 2 );
  174.     }
  175.     t_close( fd );
  176.  
  177. } /* main */
  178.  
  179. void SPXDisconReason( TLIINT fd )
  180. {
  181.     struct  t_discon discon;
  182.     char buf[ 100 ];
  183.     char *msg;
  184.  
  185.     discon.udata.buf = buf;
  186.     discon.udata.len = 0;
  187.     discon.udata.maxlen = sizeof(buf);
  188.  
  189.     printf( "SPX Connection terminated\n" );
  190.     if ( t_rcvdis( fd, &discon ) == -1 )
  191.     {
  192.         t_error( "t_rcvdis failed" );
  193.         exit( 2 );
  194.     }
  195.     printf( "Reason = %d\n" , discon.reason );
  196.     switch( discon.reason )
  197.     {
  198.     case TLI_SPX_CONNECTION_FAILED:
  199.         msg = "Connection failed";
  200.         break;
  201.     case TLI_SPX_CONNECTION_TERMINATED:
  202.         msg = "Connection terminated by client";
  203.         break;
  204.     case TLI_SPX_MALFORMED_PACKET:
  205.         msg = "Internal SPX TLIINTerface error -- malformed packet";
  206.         break;
  207.     default:
  208.         msg = "Unknown termination reason";
  209.     }
  210.     printf( "SPX Connection terminated: %s\n", msg );
  211. } /* SPXDisconReason */
  212.  
  213.  
  214.