home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / netds / winsock / nwlink / testlib / cmdline.c next >
C/C++ Source or Header  |  1997-10-05  |  19KB  |  711 lines

  1. /****************************************************************************\
  2. *  cmdline.c -- sample program library demonstrating NWLink.
  3. *
  4. *       Microsoft Developer Support
  5. *       Copyright (c) 1992-1997 Microsoft Corporation
  6. *
  7. *  Demonstrates basic sockets programming with the Windows Sockets API
  8. *  using the NWLink transport.
  9. ****************************************************************************/
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <windows.h>
  13. #include <string.h>
  14. #include <stdlib.h>
  15. #include <ctype.h>
  16. #include "externs.h"
  17. #include <wsipx.h>
  18. #include "testlib.h"
  19.  
  20. /*
  21. *   Global variables that can be set on the command line 
  22. */
  23.  
  24. int     verbose = 0;
  25. int     Socket_Type = SOCK_DGRAM;
  26. int     Protocol = NSPROTO_IPX;
  27. int     Backlog = 1;
  28. int     No_Broadcast = 0;
  29. int     No_Loop = 0;
  30. int     Sleep_Time = 250;
  31. int     Send_Length = 1024;
  32. int     Receive_Length = 1024;
  33. int     Local_Packet_Type = 0;
  34. int     Send_Packet_Type = 9;
  35. int     Filter_Packet_Type = 0;
  36. int     Local_Address_Family = AF_NS;
  37. int     Remote_Address_Family = AF_NS;
  38. char    Local_Network_Number[4]  = {0x00, 0x00, 0x00, 0x00};
  39. char    Local_Node_Number[6]     = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  40. char    Local_Socket_Number[2]   = {0x00, 0x00};
  41. char    Remote_Network_Number[4] = {0x00, 0x00, 0x00, 0x00};
  42. char    Remote_Node_Number[6]    = "\xFF\xFF\xFF\xFF\xFF\xFF";
  43. char    Remote_Socket_Number[2]  = {0x12, 0x34};
  44.  
  45. /*
  46. *   Function prototypes for this file 
  47. */
  48.  
  49. void  usage(LPSTR);
  50. void  dump_defaults(LPSTR);
  51. void  get_hex_string(LPSTR, LPSTR, int);
  52. UCHAR get_hex_byte(char);
  53.  
  54. /****************************************************************************
  55. *
  56. *    FUNCTION:  parse_cmd_line( int argc, char **argv )
  57. *
  58. *    DESCRIPTION:  Routine used by all of the WinSock test programs for NWLink.
  59. *            Parses the command line and sets the respective global variables. 
  60. *
  61. *    ARGUMENTS:     char **     => array of command line arguments
  62. *                int         number of command line arguments
  63. *
  64. *     RETURNS:  nothing
  65. *
  66. *\***************************************************************************/
  67. void parse_cmd_line(int argc, char **argv)
  68. {
  69.     LPSTR p;
  70.     int num = 1;
  71.  
  72.     argc--;
  73.  
  74.     /*
  75.     *   Parse each command line parameter 
  76.     */
  77.  
  78.     while (num <= argc) {
  79.         /*
  80.         *   If option starts with '-' or '/', skip it 
  81.         */
  82.  
  83.         p = strupr(argv[num++]);
  84.         if (*p == '-' || *p == '/')
  85.             p++;
  86.  
  87.         /*
  88.         *   Help ? 
  89.         */
  90.  
  91.         printf("***> command: %s\n:",p);
  92.         if (*p == 'h' || *p == 'H' || *p == '?' || !stricmp(p, "help"))
  93.         usage(argv[0]);
  94.  
  95.         /*
  96.         *   Verbose option? 
  97.         */
  98.  
  99.         if (!stricmp(p, "v") || !stricmp(p, "verbose")) {
  100.             verbose++;
  101.  
  102.             printf("verbose is ON\n");
  103.             continue;
  104.         }
  105.  
  106.         /*
  107.         *   Display default values ? 
  108.         */
  109.  
  110.         if (!strnicmp(p, "default", 7)) {
  111.             p+= 7;
  112.  
  113.             dump_defaults(argv[0]);
  114.         }
  115.  
  116.         /*
  117.         *   Local address family ? 
  118.         */
  119.  
  120.         if (!strnicmp(p, "laf:", 4)) {
  121.             p+= 4;
  122.  
  123.             /*
  124.             *   Get the address family from the option 
  125.             */
  126.  
  127.             Local_Address_Family = atoi(p);
  128.  
  129.             if (verbose)
  130.                 printf("Local_Address_Family = %d\n", Local_Address_Family);
  131.             continue;
  132.         }
  133.  
  134.         /*
  135.         *   Remote address family ? 
  136.         */
  137.  
  138.         if (!strnicmp(p, "raf:", 4)) {
  139.             p+= 4;
  140.  
  141.             /*
  142.             *   Get the address family from the option 
  143.             */
  144.  
  145.             Remote_Address_Family = atoi(p);
  146.  
  147.             if (verbose)
  148.                 printf("Remote_Address_Family = %d\n", Remote_Address_Family);
  149.             continue;
  150.         }
  151.  
  152.         /*
  153.         *   Socket type ? 
  154.         */
  155.  
  156.         if (!strnicmp(p, "st:", 3)) {
  157.             p+= 3;
  158.  
  159.             /*
  160.             *   Get the socket type from the option 
  161.             */
  162.  
  163.             Socket_Type = atoi(p);
  164.             if (verbose)
  165.         printf("Socket_Type = %d\n", Socket_Type);
  166.             continue;
  167.         }
  168. #if(0)
  169.         /*
  170.         *   Socket family ? 
  171.         */
  172.  
  173.         if (!strnicmp(p, "sf:", 3)) {
  174.             p+= 3;
  175.  
  176.             /*
  177.             *   Get the socket family from the option 
  178.             */
  179.  
  180.             Socket_Family = get_socket_family(p);
  181.             continue;
  182.         }
  183. #endif
  184.         /*
  185.         *   Protocol ? 
  186.         */
  187.  
  188.         if (!strnicmp(p, "proto:", 6)) {
  189.             p+= 6;
  190.  
  191.             /*
  192.             *   Get the protocol from the option 
  193.             */
  194.  
  195.             Protocol = atoi(p);
  196.  
  197.             if (verbose)
  198.             printf("Protocol = %d\n", Protocol);
  199.             continue;
  200.         }
  201.  
  202.         /*
  203.         *   Local network number ? 
  204.         */
  205.  
  206.         if (!strnicmp(p, "lnet:", 5)) {
  207.             p+= 5;
  208.  
  209.             /*
  210.             *   Get the local network number from the option 
  211.             */
  212.  
  213.             memcpy(Local_Network_Number, get_network_number(p), 4);
  214.             if (verbose) {
  215.                 printf("Local_Network_Number = ");
  216.                 print_network_num(Local_Network_Number);
  217.                 printf("\n");
  218.             }
  219.             continue;
  220.         }
  221.  
  222.  
  223.         /*
  224.         *   Local node number ? 
  225.         */
  226.  
  227.         if (!strnicmp(p, "lnode:", 6)) {
  228.             p+= 6;
  229.  
  230.             /*
  231.             *   Get the local network number from the option 
  232.             */
  233.  
  234.             memcpy(Local_Node_Number, get_node_number(p), 6);
  235.             if (verbose) {
  236.                 printf("Local_Node_Number = ");
  237.          print_node_num(Local_Node_Number);
  238.                 printf("\n");
  239.             }
  240.             continue;
  241.         }
  242.  
  243.         /*
  244.         *   Remote network number ? 
  245.         */
  246.  
  247.         if (!strnicmp(p, "rnet:", 5)) {
  248.             p+= 5;
  249.  
  250.             /*
  251.             *   Get the remote network number from the option 
  252.             */
  253.  
  254.             memcpy(Remote_Network_Number, get_network_number(p), 4);
  255.             if (verbose) {
  256.                 printf("Remote_Network_Number = ");
  257.                 print_network_num(Remote_Network_Number);
  258.                 printf("\n");
  259.             }
  260.             continue;
  261.         }
  262.  
  263.         /*
  264.         *   Remote node number ? 
  265.         */
  266.  
  267.         if (!strnicmp(p, "rnode:", 6)) {
  268.             p+= 6;
  269.  
  270.             /*
  271.             *   Get the remote network number from the option 
  272.             */
  273.  
  274.             memcpy(Remote_Node_Number, get_node_number(p), 6);
  275.             if (verbose) {
  276.                 printf("Remote_Node_Number = ");
  277.          print_node_num(Remote_Node_Number);
  278.                 printf("\n");
  279.             }
  280.             continue;
  281.         }
  282.  
  283.         /*
  284.         *   Local socket number ? 
  285.         */
  286.  
  287.         if (!strnicmp(p, "lsock:", 6)) {
  288.             p+= 6;
  289.  
  290.             /*
  291.             *   Get the local socket number from the command line 
  292.             */
  293.  
  294.             memcpy(Local_Socket_Number, get_socket_number(p), 2);
  295.  
  296.         if (verbose) {
  297.                 printf("Local_Socket_Number = ");
  298.                 print_socket_num(Local_Socket_Number);
  299.                 printf("\n");
  300.             }
  301.             continue;
  302.         }
  303.  
  304.         /*
  305.         *   Remote socket number ? 
  306.         */
  307.  
  308.         if (!strnicmp(p, "rsock:", 6)) {
  309.             p+= 6;
  310.  
  311.             /*
  312.             *   Get the remote socket number from the command line 
  313.             */
  314.  
  315.             memcpy(Remote_Socket_Number, get_socket_number(p), 2);
  316.  
  317.         if (verbose) {
  318.                 printf("Remote_Socket_Number = ");
  319.                 print_socket_num(Remote_Socket_Number);
  320.                 printf("\n");
  321.             }
  322.             continue;
  323.         }
  324.  
  325.  
  326.         /*
  327.         *   Send length ? 
  328.         */
  329.  
  330.         if (!strnicmp(p, "sendlen:", 8)) {
  331.             p+= 8;
  332.  
  333.             /*
  334.             *   Get the amount of data to send from the command line 
  335.             */
  336.  
  337.             Send_Length = atoi(p);
  338.             if (verbose)
  339.                 printf("Send length = %d\n", Send_Length);
  340.  
  341.             continue;
  342.         }
  343.  
  344.         /*
  345.         *   Receive length ? 
  346.         */
  347.  
  348.         if (!strnicmp(p, "recvlen:", 8)) {
  349.             p+= 8;
  350.  
  351.             /*
  352.             *   Get the amount of data to send from the command line 
  353.             */
  354.  
  355.             Receive_Length = atoi(p);
  356.             if (verbose)
  357.                 printf("Receive length = %d\n", Receive_Length);
  358.  
  359.             continue;
  360.         }
  361.  
  362.         /*
  363.         *   Send packet type ? 
  364.         */
  365.  
  366.         if (!strnicmp(p, "sptype:", 7)) {
  367.         p+= 7;
  368.  
  369.             /*
  370.             *   Get the packet type from the command line 
  371.             */
  372.  
  373.             Send_Packet_Type = atoi(p);
  374.  
  375.           if (verbose)
  376.         printf("Send_Packet_Type = %d\n", Send_Packet_Type);
  377.             continue;
  378.         }
  379.  
  380.         /*
  381.         *   Local packet type ? 
  382.         */
  383.  
  384.         if (!strnicmp(p, "lptype:", 7)) {
  385.         p+= 7;
  386.  
  387.             /*
  388.             *   Get the packet type from the command line 
  389.             */
  390.  
  391.             Local_Packet_Type = atoi(p);
  392.  
  393.           if (verbose)
  394.         printf("Send_Packet_Type = %d\n", Send_Packet_Type);
  395.             continue;
  396.         }
  397.  
  398.         /*
  399.         *   Filter packet type ? 
  400.         */
  401.  
  402.         if (!strnicmp(p, "fptype:", 7)) {
  403.         p+= 7;
  404.  
  405.             /*
  406.             *   Get the packet type from the command line 
  407.             */
  408.  
  409.             Filter_Packet_Type = atoi(p);
  410.  
  411.           if (verbose)
  412.         printf("Filter_Packet_Type = %d\n", Send_Packet_Type);
  413.             continue;
  414.         }
  415.  
  416.         /*
  417.         *   Backlog size ? 
  418.         */
  419.  
  420.         if (!strnicmp(p, "backlog:", 8)) {
  421.          p+= 8;
  422.  
  423.             Backlog = atoi(p);
  424.  
  425.             if (verbose)
  426.                 printf("Backlog = %d\n", Backlog);
  427.             continue;
  428.         }
  429.  
  430.         /*
  431.         *   No broadcast flag ? 
  432.         */
  433.  
  434.         if (!strnicmp(p, "nobcast", 7)) {
  435.             p+= 7;
  436.  
  437.             No_Broadcast++;
  438.  
  439.             if (verbose)
  440.                 printf("No broadcast flag is set\n");
  441.  
  442.             continue;
  443.         }
  444.  
  445.         /*
  446.         *   No loop flag ? 
  447.         */
  448.  
  449.         if (!strnicmp(p, "noloop", 6)) {
  450.             p+= 6;
  451.  
  452.             No_Loop++;
  453.  
  454.             if (verbose)
  455.                 printf("No loop flag is set\n");
  456.  
  457.             continue;
  458.         }
  459.  
  460.         /*
  461.         *   Sleep time ? 
  462.         */
  463.  
  464.         if (!strnicmp(p, "sleep:", 6)) {
  465.             p+= 6;
  466.  
  467.             Sleep_Time = atoi(p);
  468.  
  469.             if (verbose)
  470.                 printf("Sleep time = %d\n", Sleep_Time);
  471.  
  472.             continue;
  473.         }
  474.  
  475.  
  476.         if (*p)
  477.             printf("Unknown command line parameter: %s\n", p);
  478.  
  479.     } /* while */
  480.  
  481.     if (verbose)
  482.         printf("\n\n");
  483. }
  484.  
  485. /****************************************************************************
  486. *
  487. *    FUNCTION:  usage( LPSTR progname )
  488. *
  489. *    PURPOSE:   Displays all allowable command line parameters.  (All may not be used
  490. *               by the program linking to this library, however).
  491. *
  492. *    ARGUMENTS:    LPSTR    => program name
  493. *
  494. *     RETURNS:   exits with errorlevel 0
  495. *
  496. *\***************************************************************************/
  497. void usage(LPSTR progname)
  498. {
  499.     printf("\n\nUsage: %s [options]\n", progname);
  500.     printf("\n");
  501.     printf("Valid options are:\n");
  502.     printf("-v               Toggles verbose mode ON\n");
  503.     printf("-laf:x           Sets local address family to x\n");
  504.     printf("-raf:x           Sets remote address family to x\n");
  505.     printf("-st:x            Sets socket type to x\n");
  506.     printf("-proto:x         Sets protocol to x\n");
  507.     printf("-sleep:x         Sets sleep time between sends to x milliseconds\n");
  508.     printf("-backlog:x       Sets listen backlog size to x indications\n");
  509.     printf("-nobcast         Sets flag so program won't set sockopt to broadcast\n");
  510.     printf("-noloop          Sets flag so program won't loop\n");
  511.     printf("-sptype:x        Sets send packet type to x\n");
  512.     printf("-lptype:x        Sets local packet type to x\n");
  513.     printf("-fptype:x        Sets filter for incoming packet type x\n");
  514.     printf("-sendlen:x       Sets amount of data to send to x bytes\n");
  515.     printf("-recvlen:x       Sets amount of data to receive to x bytes\n");
  516.     printf("-lnet:xxxx       Sets local network number to xxxx (1)\n");
  517.     printf("-lnode:xxxxxx    Sets local node number to xxxxxx (1)\n");
  518.     printf("-rnet:xxxx       Sets remote network number to xxxx (1)\n");
  519.     printf("-rnode:xxxxxx    Sets remote node number to xxxxxx (1)\n");
  520.     printf("-rsock:xx        Sets remote socket number to xx (1)\n");
  521.     printf("-default         Displays programs default values\n");
  522.     printf("-?, -help, or -h Displays this screen\n");
  523.     printf("\n");
  524.     printf("Notes:  (1) Network numbers (network, node, and socket) must\n");
  525.     printf("            be specified as a series of hexadecimal numbers,\n");
  526.     printf("            for example: -lnet:04003BFF. \n");
  527.     printf("\n");
  528.     printf("        All values must come immediately after the ':'\n");
  529.     printf("        -default and/or -v should be first\n");
  530.     printf("        Not all programs make use of all the above parameters\n");
  531.  
  532.     exit(0);
  533. }
  534.  
  535. /****************************************************************************
  536. *
  537. *    FUNCTION:  dump_defaults( LPSTR progname )
  538. *
  539. *    PURPOSE:   Prints out the current values of the command line options
  540. *               
  541. *
  542. *    ARGUMENTS:    LPSTR    => program name
  543. *
  544. *     RETURNS:   nothing
  545. *
  546. *\***************************************************************************/
  547. void dump_defaults(LPSTR progname)
  548. {
  549.     printf("Default option values for %s:\n\n", progname);
  550.  
  551.     printf("verbose =                %d\n", verbose);
  552.     printf("socket type =            %d\n", Socket_Type);
  553.     printf("protocol =               %d\n", Protocol);
  554.     printf("sleep time =             %d\n", Sleep_Time);
  555.     printf("backlog =                %d\n", Backlog);
  556.     printf("nobcast =                %d\n", No_Broadcast);
  557.     printf("noloop =                 %d\n", No_Loop);
  558.     printf("send length =            %d\n", Send_Length);
  559.     printf("receive length =         %d\n", Receive_Length);
  560.     printf("send packet type =       %d\n", Send_Packet_Type);
  561.     printf("local packet type =      %d\n", Local_Packet_Type);
  562.     printf("filter packet type =     %d\n", Filter_Packet_Type);
  563.     printf("local address family =   %d\n", Local_Address_Family);
  564.     printf("remote address family =  %d\n", Remote_Address_Family);
  565.     printf("local network number =   ");
  566.     print_network_num(Local_Network_Number);
  567.     printf("\nlocal node number =      ");
  568.     print_node_num(Local_Node_Number);
  569.     printf("\nlocal socket number =    ");
  570.     print_socket_num(Local_Socket_Number);
  571.     printf("\nremote network number =  ");
  572.     print_network_num(Remote_Network_Number);
  573.     printf("\nremote node number =     ");
  574.     print_node_num(Remote_Node_Number);
  575.     printf("\nremote socket number =   ");
  576.     print_socket_num(Remote_Socket_Number);
  577.     printf("\n\n");
  578. }
  579.  
  580.  
  581. /****************************************************************************
  582. *
  583. *    FUNCTION:  get_network_number( LPSTR cmd )
  584. *
  585. *    PURPOSE:   Reads a network number from the given string
  586. *
  587. *
  588. *    ARGUMENTS:    LPSTR  => string to read from
  589. *
  590. *     RETURNS:   LPSTR  => hex network number
  591. *
  592. *\***************************************************************************/
  593. LPSTR get_network_number(LPSTR cmd)
  594. {
  595.     static char hex_num[4];
  596.  
  597.     memset(hex_num, 0, 4);
  598.  
  599.     if (strlen(cmd) != 8) {
  600.         printf("Incorrect format for network number.\n");
  601.         exit(1);
  602.     }
  603.  
  604.     get_hex_string(cmd, hex_num, 4);
  605.  
  606.     return hex_num;
  607. }
  608.  
  609. /****************************************************************************
  610. *
  611. *    FUNCTION:  get_node_number( LPSTR cmd )
  612. *
  613. *    PURPOSE:   Reads a node number from the given string
  614. *
  615. *
  616. *    ARGUMENTS:    LPSTR  => string to read from
  617. *
  618. *     RETURNS:   LPSTR  => hex network number
  619. *
  620. *\***************************************************************************/
  621. LPSTR get_node_number(LPSTR cmd)
  622. {
  623.     static char hex_num[6];
  624.  
  625.     memset(hex_num, 0, 6);
  626.  
  627.     if (strlen(cmd) != 12) {
  628.         printf("Incorrect format for node number.\n");
  629.         exit(1);
  630.     }
  631.  
  632.     get_hex_string(cmd, hex_num, 6);
  633.  
  634.     return hex_num;
  635. }
  636.  
  637. /****************************************************************************
  638. *
  639. *    FUNCTION:  get_socket_number( LPSTR cmd )
  640. *
  641. *    PURPOSE:   Reads a socket number from the given string
  642. *
  643. *
  644. *    ARGUMENTS:    LPSTR  => string to read from
  645. *
  646. *     RETURNS:   LPSTR  => hex network number
  647. *
  648. *\***************************************************************************/
  649. LPSTR get_socket_number(LPSTR cmd)
  650. {
  651.     static char hex_num[2];
  652.  
  653.     memset(hex_num, 0, 2);
  654.  
  655.     if (strlen(cmd) != 4) {
  656.         printf("Incorrect format for socket number.\n");
  657.         exit(1);
  658.     }
  659.  
  660.     get_hex_string(cmd, hex_num, 2);
  661.  
  662.     return hex_num;
  663. }
  664.  
  665. /****************************************************************************
  666. *
  667. *    FUNCTION:  get_hex_string( LPSTR src, LPSTR dest, int num )
  668. *
  669. *    PURPOSE:   Reads in a character string containing hex digits and converts
  670. *                it to a hexadecimal number.
  671. *
  672. *    ARGUMENTS:    LPSTR  => source string
  673. *                LPSTR  => destination for hex number
  674. *                int    number of bytes to convert    
  675. *
  676. *     RETURNS:   nothing
  677. *
  678. *\***************************************************************************/
  679. void get_hex_string(LPSTR src, LPSTR dest, int num)
  680. {
  681.     LPSTR q = src;
  682.  
  683.     while (num--)
  684.         *dest++ = (get_hex_byte(*q++) << 4) + get_hex_byte(*q++);
  685.  
  686. }
  687.  
  688. /****************************************************************************
  689. *
  690. *    FUNCTION:  get_hex_byte( char ch )
  691. *
  692. *    PURPOSE:   Converts the character passed in to a hexadecimal nibble.
  693. *
  694. *    ARGUMENTS:    char    character to convert
  695. *
  696. *     RETURNS:   UCHAR   hex nibble
  697. *
  698. *\***************************************************************************/
  699. UCHAR get_hex_byte(char ch)
  700. {
  701.     if (ch >= '0' && ch <= '9')
  702.         return (ch - '0');
  703.  
  704.     if (ch >= 'A' && ch <= 'F')
  705.         return ((ch - 'A') + 0x0A);
  706.  
  707.     printf("Illegal character %c in hex string\n", ch);
  708.     exit(1);
  709. }
  710.