home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / viscobv6.zip / vac22os2 / ibmcobol / samples / toolkit / tcpiptk / echosamp / echoclnt / echoclnt.c < prev    next >
Text File  |  1996-11-19  |  7KB  |  193 lines

  1. /********************************************************copyrite.xic********/
  2. /*                                                                          */
  3. /*   Licensed Materials - Property of IBM                                   */
  4. /*   IBM TCP/IP for OS/2                                                    */
  5. /*   (C) Copyright IBM Corporation. 1996.                                   */
  6. /*                                                                          */
  7. /*   All rights reserved.                                                   */
  8. /*                                                                          */
  9. /*   US Government Users Restricted Rights -                                */
  10. /*   Use, duplication or disclosure restricted by GSA ADP Schedule          */
  11. /*   Contract with IBM Corp.                                                */
  12. /*                                                                          */
  13. /*--------------------------------------------------------------------------*/
  14. /*                                                                          */
  15. /*  DISCLAIMER OF WARRANTIES.  The following [enclosed] code is             */
  16. /*  sample code created by IBM Corporation. This sample code is not         */
  17. /*  part of any standard or IBM product and is provided to you solely       */
  18. /*  for  the purpose of assisting you in the development of your            */
  19. /*  applications.  The code is provided "AS IS", without                    */
  20. /*  warranty of any kind.  IBM shall not be liable for any damages          */
  21. /*  arising out of your use of the sample code, even if they have been      */
  22. /*  advised of the possibility of such damages.                             */
  23. /*                                                                          */
  24. /*--------------------------------------------------------------------------*/
  25.  
  26. /******************************************************************************
  27. *
  28. * An alternative version of the ECHO client
  29. * -----------------------------------------
  30. *
  31. * Written by Andre Asselin
  32. *
  33. * For use with "Introduction to sockets programming with IBM TCP/IP for OS/2"
  34. *
  35. *
  36. * Description
  37. * -----------
  38. *
  39. * This program implements the client side of the Echo protocol (RFC 862).  The
  40. * Echo protocol is very simple: whatever the client sends to the server, the
  41. * server will send right back to the client.  The complete RFC is reproduced
  42. * below:
  43. *
  44.  
  45. Network Working Group                                          J. Postel
  46. Request for Comments: 862                                            ISI
  47.                                                                 May 1983
  48.  
  49.                              Echo Protocol
  50.  
  51. This RFC specifies a standard for the ARPA Internet community.  Hosts on
  52. the ARPA Internet that choose to implement an Echo Protocol are expected
  53. to adopt and implement this standard.
  54.  
  55. A very useful debugging and measurement tool is an echo service.  An
  56. echo service simply sends back to the originating source any data it
  57. receives.
  58.  
  59. TCP Based Echo Service
  60.  
  61.    One echo service is defined as a connection based application on TCP.
  62.    A server listens for TCP connections on TCP port 7.  Once a
  63.    connection is established any data received is sent back.  This
  64.    continues until the calling user terminates the connection.
  65.  
  66. UDP Based Echo Service
  67.  
  68.    Another echo service is defined as a datagram based application on
  69.    UDP.  A server listens for UDP datagrams on UDP port 7.  When a
  70.    datagram is received, the data from it is sent back in an answering
  71.    datagram.
  72.  
  73. *
  74. ******************************************************************************/
  75.  
  76.  
  77. #include <stdlib.h>
  78. #include <stdio.h>
  79.  
  80. #include <types.h>
  81. #include <netinet/in.h>
  82. #include <sys/socket.h>
  83. #include <netdb.h>
  84.  
  85.  
  86. void main(int argc, char **argv) {
  87.    struct sockaddr_in server;
  88.    struct hostent *hp;
  89.    char buf[100];
  90.    struct servent *echoprot;
  91.    int sock, len, rc;
  92.  
  93.    // Initialize TCP/IP
  94.  
  95.    if (sock_init() != 0) {
  96.       printf("INET.SYS probably is not running");
  97.       exit(1);
  98.    }
  99.  
  100.    // Check to make sure the user passed the right number of arguments
  101.  
  102.    if (argc != 3  ||  argc > 1 && argv[1][0] == '?') {
  103.       printf("Usage:\n"
  104.              "──echoclnt──┬─ TCP ─┬─<host>──\n"
  105.              "              └─ UDP ─┘\n"
  106.              "\n"
  107.              "TCP    Specifies to use TCP as the connection protocol.\n"
  108.              "UDP    Specifies to use UDP as the connection protocol.\n"
  109.              "<host> Specifies the remote host on which the command is to be issued.\n");
  110.       exit(1);
  111.    }
  112.  
  113.    // Open the correct type of socket
  114.  
  115.    if (stricmp(argv[1], "TCP") == 0) {
  116.       sock = socket(AF_INET, SOCK_STREAM, 0);
  117.       if (sock == -1) {
  118.          psock_errno("socket()");
  119.          exit(1);
  120.       }
  121.    } else if (stricmp(argv[1], "UDP") == 0) {
  122.       sock = socket(AF_INET, SOCK_DGRAM, 0);
  123.       if (sock == -1) {
  124.          psock_errno("socket()");
  125.          exit(1);
  126.       }
  127.    } else {
  128.       printf("You must specify either 'tcp' or 'udp' as the connection protocol.\n");
  129.       exit(1);
  130.    }
  131.  
  132.    // Set the server address from argument 2 -- we accept both domain names
  133.    // and IP addresses
  134.  
  135.    server.sin_addr.s_addr = inet_addr(argv[2]);
  136.    if (server.sin_addr.s_addr == -1) {
  137.       // It wasn't a dotted decimal address -- assume it's a domain name,
  138.       // and use gethostbyname() to convert it
  139.  
  140.       hp = gethostbyname(argv[2]);
  141.       if (hp) {
  142.          server.sin_family = hp->h_addrtype;
  143.          memcpy(&server.sin_addr, hp->h_addr, sizeof(server.sin_addr));
  144.       } else {
  145.          printf("Unknown host %s\n", argv[2]);
  146.          exit(1);
  147.       }
  148.    }
  149.  
  150.    // Get the port for the echo protocol out of the etc\services file
  151.  
  152.    echoprot = getservbyname("echo", argv[1]);
  153.    if (echoprot == NULL) {
  154.       printf("The echo/%s protocol is not listed in the etc/services file\n", argv[1]);
  155.       exit(1);
  156.    }
  157.  
  158.    // Set the rest of the server address
  159.  
  160.    server.sin_family = AF_INET;   
  161.    server.sin_port = echoprot->s_port;
  162.  
  163.    // Connect to the server
  164.  
  165.    rc = connect(sock, (struct sockaddr *)&server, sizeof(server));
  166.    if (rc == -1) {
  167.       psock_errno("connect()");
  168.       exit(1);
  169.    }
  170.  
  171.    while (1) {
  172.       if (gets(buf) == NULL) {
  173.          printf("gets() returned NULL\n");
  174.          exit(1);
  175.       }
  176.  
  177.       rc = send(sock, buf, strlen(buf), 0);
  178.       if (rc == -1) {
  179.          psock_errno("send()");
  180.          exit(1);
  181.       }
  182.  
  183.       len = recv(sock, buf, sizeof(buf), 0);
  184.       if (len == -1) {
  185.          psock_errno("recv()");
  186.          exit(1);
  187.       }
  188.  
  189.       buf[len] = '\0';
  190.       printf("%s\n", buf);
  191.    }
  192. }
  193.