PING.C
上传用户:better800
上传日期:2022-06-13
资源大小:1853k
文件大小:4k
源码类别:

TCP/IP协议栈

开发平台:

DOS

  1. /******************************************************************************
  2.     PING - internet diagnostic tool
  3.     Copyright (C) 1991 Erick Engelke
  4.     portions Copyright (C) 1990, National Center for Supercomputer Applications
  5.     This program is free software; you can redistribute it and/or modify
  6.     it, but you may not sell it.
  7.     This program is distributed in the hope that it will be useful,
  8.     but without any warranty; without even the implied warranty of
  9.     merchantability or fitness for a particular purpose.
  10.         Erick Engelke                   or via E-Mail
  11.         Faculty of Engineering
  12.         University of Waterloo          Erick@development.watstar.uwaterloo.ca
  13.         200 University Ave.,
  14.         Waterloo, Ont., Canada
  15.         N2L 3G1
  16. ******************************************************************************/
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <conio.h>
  21. #include <tcp.h>
  22. longword sent = 0L;
  23. longword received = 0L;
  24. longword tot_delays = 0L;
  25. longword last_rcvd = 0L;
  26. char *name;
  27. void stats(void)
  28. {
  29.     longword temp;
  30.     puts("nPing Statistics");
  31.     printf("Sent        : %lu n", sent );
  32.     printf("Received    : %lu n", received );
  33.     if (sent)
  34. printf("Success     : %lu %n", (100L*received)/sent);
  35.     if (!received)
  36. printf("There was no response from %sn", name );
  37.     else {
  38.         temp = ( tot_delays * 2813L)/(512L*received + 1);
  39. printf("Average RTT : %lu.%02lu secondsn", temp / 100L, temp % 100L);
  40.     }
  41.     exit( received ? 0 : 1 );
  42. }
  43. void help(void)
  44. {
  45.     puts("PING [-s|/s] [-d|/d] hostname [number]");
  46.     exit( 3 );
  47. }
  48. int main(int argc, char **argv)
  49. {
  50.     longword host, timer, new_rcvd;
  51.     longword tot_timeout = 0L, itts = 0L, send_timeout = 0L;
  52.     word i;
  53.     word sequence_mode = 0, is_new_line = 1;
  54.     word debug = 0;
  55.     unsigned char tempbuffer[255];
  56.     sock_init();
  57.     if ( argc < 2 )
  58. help();
  59.     name = NULL;
  60.     for ( i = 1; i < argc ; ++i ) {
  61. if ( !stricmp( argv[i], "-d") || !stricmp( argv[i],"/d")) {
  62.     puts("Debug mode activated");
  63.             debug = 1;
  64.     tcp_set_debug_state( 1 );
  65. } else if ( !stricmp( argv[i], "-s") || !stricmp( argv[i],"/s"))
  66.     sequence_mode = 1;
  67. else if ( !name )
  68.     name = argv[i];
  69. else {
  70.     sequence_mode = 1;
  71.     itts = atol( argv[i] );
  72. }
  73.     }
  74.     if (!name)
  75. help();
  76.     if (!(host = resolve( name ))) {
  77. printf("Unable to resolve '%s'n", name );
  78. exit( 3 );
  79.     }
  80.     if ( isaddr( name ))
  81. printf("Pinging [%s]",inet_ntoa(tempbuffer, host));
  82.     else
  83. printf("Pinging '%s' [%s]",name, inet_ntoa(tempbuffer, host));
  84.     if (itts) printf(" %u times", itts);
  85.     else
  86. itts = sequence_mode ? 0xffffffffL : 1;
  87.     if (sequence_mode) printf(" once per_second");
  88.     printf("n");
  89.     tot_timeout = set_timeout( itts + 10 );
  90.     _arp_resolve( host, (eth_address *)tempbuffer, 0 );   /* resolution it before timer starts */
  91.     if ( debug ) printf("ETH -> %x %x %x %x %x %xn",
  92.         tempbuffer[0],tempbuffer[1],tempbuffer[2],tempbuffer[3],
  93.         tempbuffer[4],tempbuffer[5]);
  94.     do {
  95. /* once per second - do all this */
  96. if ( chk_timeout( send_timeout ) || !send_timeout ) {
  97.     send_timeout = set_timeout( 1 );
  98.     if ( chk_timeout( tot_timeout ) && tot_timeout )
  99. stats();
  100.     if ( sent < itts ) {
  101. sent++;
  102. if (_ping( host , sent ))
  103.     stats();
  104. if (!is_new_line) printf("n");
  105. printf("sent PING # %lu ", sent );
  106. is_new_line = 0;
  107.     }
  108. }
  109. if ( kbhit() ) {
  110.     getch(); /* trash the character */
  111.     stats();
  112. }
  113. tcp_tick(NULL);
  114. if ((timer = _chk_ping( host , &new_rcvd)) != 0xffffffffL) {
  115.     tot_delays += timer;
  116.     ++received;
  117.     if ( new_rcvd != last_rcvd + 1 ) {
  118. if (!is_new_line) printf("n");
  119. puts("PING receipt received out of order!");
  120. is_new_line = 1;
  121.     }
  122.     last_rcvd = new_rcvd;
  123.     if (!is_new_line) printf(", ");
  124.     printf("PING receipt # %lu : response time %lu.%02lu secondsn", received, timer / 18L, ((timer %18L)*55)/10 );
  125.     is_new_line = 1;
  126.     if ( received == itts )
  127. stats();
  128. }
  129.     } while (1);
  130. }