CMDLINE.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:18k
源码类别:

Windows编程

开发平台:

Visual C++

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