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