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

TCP/IP协议栈

开发平台:

DOS

  1. #include <mem.h>
  2. #include <copyright.h>
  3. #include <wattcp.h>
  4. #include <icmp.h>
  5. // R. Whitby
  6. extern void (*_dbugxmit)( sock_type *s, in_Header *inp, void *phdr,
  7.      unsigned line );
  8. int _send_ping( longword host, longword countnum, byte ttl, byte tos, longword *theid )
  9. {
  10.     eth_address dest;
  11.     struct _pkt *p;
  12.     in_Header *ip;
  13.     struct icmp_echo *icmp;
  14.     static word icmp_id = 0;
  15.     if ((host & 0xff) == 0xff ) {
  16. outs( "rnPING: Cannot ping a network!nr");
  17. return( -1 );
  18.     }
  19.     if ( ! _arp_resolve( host, &dest, 0 )) {
  20. outs( "rnPING: Cannot resolve host's hardware addressnr");
  21. return( -1 );
  22.     }
  23.     if (debug_on) {
  24. outs("nrPING: Destination Hardware :");
  25. outhexes( (char *)&dest, 6 );
  26. outs("nr");
  27.     }
  28.     p = (struct _pkt*)_eth_formatpacket( &dest, 8 );
  29.     ip = &p->in;
  30.     memset( ip, 0, sizeof( in_Header ));
  31.     icmp = &(p->icmp.echo);
  32.     icmp->type = 8;
  33.     icmp->code = 0;
  34.     icmp->index = countnum;
  35.     *(longword *)(&icmp->identifier) = set_timeout( 1 );
  36.     if( theid ) *theid = *(longword *)(&icmp->identifier);
  37. /*
  38.     icmp->identifier = ++icmp_id;
  39.     icmp->sequence = icmp_id;
  40. */
  41.     /* finish the icmp checksum portion */
  42.     icmp->checksum = 0;
  43.     icmp->checksum = ~checksum( icmp, sizeof(struct icmp_echo) );
  44.     /* encapsulate into a nice ip packet */
  45.     ip->ver = 4;
  46.     ip->hdrlen = 5;
  47.     ip->length = intel16( sizeof( in_Header ) + sizeof( struct icmp_echo));
  48.     ip->tos = tos;
  49.     ip->identification = intel16( icmp_id ++); /* not using ip id */
  50. //    ip->frag = 0;
  51.     ip->ttl = ttl;
  52.     ip->proto = ICMP_PROTO;
  53.     ip->checksum = 0;
  54.     ip->source = intel( my_ip_addr );
  55.     ip->destination = intel( host );
  56.     ip->checksum = ~ checksum( ip, sizeof( in_Header ));
  57.     if (_dbugxmit) (*_dbugxmit)( NULL, ip, icmp, 0); // R. Whitby
  58.     return( _eth_send( intel16( ip->length )));
  59. }