midrange.com code scratchpad
Name:
Check TCP Port status
Scriptlanguage:
Plain Text
Tabwidth:
4
Date:
06/30/2008 06:47:03 pm
IP:
Logged
Description:
Example command and RPG program to check TCP/IP port status on specified IP address.
Code:
  1. ====== Command definition: CHKTCPPRT =======
  2.  
  3.              cmd        prompt('Check TCP port')
  4.              parm       kwd(ipaddr) type(*char) len(128) prompt('IP +
  5.                           Address') min(1)
  6.              parm       kwd(port) type(*int4) dft(80) prompt('Port')
  7.  
  8.  
  9.  
  10.  
  11.  
  12. ===== Command processing program: CHKTCPPRTE ==========
  13.  
  14.  
  15.  
  16.  
  17.       // Check TCP port status
  18.  
  19.      h dftactgrp(*no)
  20.      h actgrp(*new)
  21.  
  22.      d chgtcpprte      pr                  extpgm('CHKTCPPRTE')
  23.      d  inaddress                   128a
  24.      d  inport                        4a
  25.      d  returnval                      n   options(*omit : *nopass)
  26.  
  27.      d chgtcpprte      pi
  28.      d  inaddress                   128a
  29.      d  inport                        4a
  30.      d  returnval                      n   options(*omit : *nopass)
  31.  
  32.       // Information on sockets and RPG IV can be found at Scott Klement's
  33.       // socket tutorial at http://www.scottklement.com/rpg/socktut/index.html
  34.  
  35.       // Prototypes for socket APIs required...
  36.  
  37.       // Get service by name.
  38.      d getservbyname   pr              *   extproc('getservbyname')
  39.      d  service_name                   *   value options(*string)
  40.      d  protocol_name                  *   value options(*string)
  41.       // example: p_servent = getservbyname( 'http' : 'tcp' );
  42.       // returns *NULL if service not found
  43.  
  44.      d p_servent       s               *
  45.      d servent         ds                  based(p_servent)
  46.      d  s_name                         *
  47.      d  s_aliases                      *
  48.      d  s_port                       10i 0
  49.      d  s_proto                        *
  50.  
  51.       // Convert dotted decimal IP address to 32-bit network address.
  52.      d inet_addr       pr            10u 0 extproc('inet_addr')
  53.      d  address_str                    *   value options(*string)
  54.       // example: ip = inet_addr('192.168.1.1');
  55.       //          if ip = INADDR_NONE; // Conversion failed.
  56.  
  57.      d INADDR_NONE     c                   4294967295
  58.  
  59.       // Convert 32-bit network address to dotted decimal
  60.      d inet_ntoa       pr              *   extproc('inet_ntoa')
  61.      d  internet_addr                10u 0 value
  62.       // example: ptr = inet_ntoa(ip);
  63.       //          if ptr <> *null;
  64.       //          dottedip = %str(ptr);
  65.  
  66.       // Get host information by DNS lookup.
  67.      d gethostbyname   pr              *   extproc('gethostbyname')
  68.      d  host_name                      *   value options(*string)
  69.  
  70.      d p_hostent       s               *
  71.      d hostent         ds                  based(p_hostent)
  72.      d  h_name                         *
  73.      d  h_aliases                      *
  74.      d  h_addrtype                   10i 0
  75.      d  h_length                     10i 0
  76.      d  h_addr_list                    *
  77.      d p_h_addr        s               *   based(h_addr_list)
  78.      d h_addr          s             10u 0 based(p_h_addr)
  79.  
  80.      d socket          pr            10i 0 extproc('socket')
  81.      d  addr_family                  10i 0 value
  82.      d  type                         10i 0 value
  83.      d  protocol                     10i 0 value
  84.  
  85.      d AF_INET         c                   2
  86.      d SOCK_STREAM     c                   1
  87.      d IPPROTO_IP      c                   0
  88.       // example: s = socket( AF_INET : SOCK_STREAM : IPPROTO_IP );
  89.  
  90.      d connect         pr            10i 0 extproc('connect')
  91.      d  sock_desc                    10i 0 value
  92.      d  dest_addr                      *   value
  93.      d  addr_len                     10i 0 value
  94.  
  95.      d p_sockaddr      s               *
  96.      d sockaddr        ds                  based(p_sockaddr)
  97.      d  sa_family                     5i 0
  98.      d  sa_data                      14a
  99.      d sockaddr_in     ds                  based(p_sockaddr)
  100.      d  sin_family                    5i 0
  101.      d  sin_port                      5u 0
  102.      d  sin_addr                     10u 0
  103.      d  sin_zero                      8a
  104.  
  105.      d close           pr            10i 0 extproc('close')
  106.      d  sock_desc                    10i 0 value
  107.  
  108.  
  109.  
  110.       // Local variables.
  111.      d ip              s             10u 0
  112.      d msg             s             50a
  113.      d p_connto        s               *
  114.      d addrlen         s             10i 0
  115.      d sock            s             10i 0
  116.      d usereturnval    s               n   inz(*off)
  117.  
  118.      d workport        s              5u 0
  119.      d                 ds
  120.      d binportx                1      4
  121.      d binport                 1      4b 0
  122.  
  123.       /free
  124.  
  125.        usereturnval = *off;
  126.        if %parms() > 2;
  127.          usereturnval = *on;
  128.        endif;
  129.        if usereturnval;
  130.          returnval = *off; // Not connected by default.
  131.        endif;
  132.  
  133.        // Convert port from input format to required format by APIs.
  134.        evalr binportx = inport;
  135.        if binport <= 0;
  136.          binport = 80;
  137.        endif;
  138.        workport = binport;
  139.  
  140.        // Determine if we have an IP address or name. If name, try to resolve
  141.        // to IP address.
  142.        ip = inet_addr(%trim(inaddress));
  143.        if ip = INADDR_NONE;
  144.          p_hostent = gethostbyname(%trim(inaddress));
  145.          if p_hostent <> *null;
  146.            ip = h_addr;
  147.          endif;
  148.        endif;
  149.  
  150.        msg = 'In host: ' + inaddress;
  151.        dsply msg;
  152.        msg = 'In port: ' + %char(workport);
  153.        dsply msg;
  154.  
  155.        if ip = INADDR_NONE;
  156.          msg = 'Host not found.';
  157.        else;
  158.          msg = 'IP address: ' + %str(inet_ntoa(ip));
  159.        endif;
  160.        dsply msg;
  161.  
  162.        sock = socket( AF_INET : SOCK_STREAM : IPPROTO_IP );
  163.  
  164.        // Get some memory to store the socket address information.
  165.        addrlen = %size(sockaddr);
  166.        p_connto = %alloc( addrlen );
  167.  
  168.        // Point the socket address structure at the newly allocated memory.
  169.        p_sockaddr = p_connto;
  170.  
  171.        // Populate socket connect structure.
  172.        sin_family = AF_INET;
  173.        sin_addr = ip;
  174.        sin_port = workport;
  175.        sin_zero = *allx'00';
  176.  
  177.        if connect( sock : p_connto : addrlen ) < 0;
  178.          msg = 'Connect failed.';
  179.        else;
  180.          if usereturnval;
  181.            returnval = *on;
  182.          endif;
  183.          msg = 'Connected.';
  184.        endif;
  185.  
  186.        dsply msg;
  187.  
  188.        callp close( sock ); // Need callp to distinguish from RPG close file.
  189.  
  190.        dealloc(n) p_connto;
  191.  
  192.        msg = 'Connection closed.';
  193.        dsply msg;
  194.  
  195.        *inlr = *on;
  196.        return;
  197.  
  198.       /end-free
  199.  
© 2004-2019 by midrange.com generated in 0.007s valid xhtml & css