home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume25 / sockdemo / disockt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-12  |  2.8 KB  |  101 lines

  1. /* disockt.c -- open an internet socket and talk dgrams into it */
  2. /* (C) 1991 Blair P. Houghton, All Rights Reserved, copying and */
  3. /* distribution permitted with copyright intact.        */
  4.  
  5. #include <stdio.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <netdb.h>
  10. #include <math.h>
  11.  
  12. #ifdef __STDC__
  13. extern void    perror( char * );
  14. extern int    bind( int, struct sockaddr *, int );
  15. extern int    socket( int, int, int );
  16. extern int    write( int, char *, unsigned );
  17. extern char *    strcpy( char *, char *b );
  18. extern int    strlen( char * );
  19. extern void    exit( int );
  20. extern int    connect( int, struct sockaddr *, int );
  21. extern struct hostent *    gethostbyname( char * );
  22. extern int    fprintf( FILE *, char *, ... );
  23. extern int    atoi( char * );
  24. extern void    bcopy( char *, char *b, int );
  25. #endif
  26.  
  27. char *line[] = {
  28.     "Mary had a little lamb;\n",
  29.     "Its fleece was white as snow;\n",
  30.     "And everywhere that Mary went,\n",
  31.     "She told everyone that Edison invented\nthe telephone before Bell did.\n"
  32. };
  33. int n_line = 4;
  34.  
  35. /*
  36.  *  argv 0 is program name; argv 1 is remote host; argv 2 is
  37.  *  port number of listener on remote host
  38.  */
  39. #ifdef __STDC__
  40. void main( int argc, char *argv[] )
  41. #else
  42. main(argc,argv)
  43. int argc; char *argv[];
  44. #endif
  45. {
  46.  
  47.     int plug;                /* socket to "plug" into the socket */
  48.     struct sockaddr_in socketname;    /* mode, addr, and port    */
  49.                     /* data for the socket    */
  50.     struct hostent *remote_host;    /* internet numbers, names */
  51.     extern int n_line;
  52.     extern char *line[];
  53.     char buf[BUFSIZ];
  54.     int i, sendflags;
  55.  
  56.     /* make an internet-transmitted, dgram-i/o-style, protocol-whatever plug */
  57.     if ( (plug = socket( AF_INET, SOCK_DGRAM, 0 )) < 0 )
  58.     perror(argv[0]);
  59.  
  60.     /* plug it into the listening socket */
  61.     socketname.sin_family = AF_INET;
  62.     if ( (remote_host = gethostbyname( argv[1] )) == (struct hostent *)NULL ) {
  63.     fprintf( stderr, "%s: unknown host: %s\n",
  64.          argv[0], argv[1] );
  65.     exit(__LINE__);
  66.     }
  67.     (void) bcopy( (char *)remote_host->h_addr, (char *) &socketname.sin_addr,
  68.           remote_host->h_length );
  69.     socketname.sin_port = htons(atoi(argv[2]));
  70.  
  71.     printf("sending %d dgrams to:\n", n_line);
  72.     printf(
  73. "struct sockaddr_in {\n\
  74.     sin_family        = %d\n\
  75.     sin_addr.s_addr    = %s\n\
  76.     sin_port         = %d\n\
  77. } socketname;\n"
  78. , socketname.sin_family
  79. , inet_ntoa(socketname.sin_addr)
  80. /* , socketname.sin_addr.s_addr -- gives unsigned long, not struct in_addr */
  81. , ntohs(socketname.sin_port)
  82.     );
  83.  
  84.     /* say something into it; something historic */
  85.     sendflags = 0;
  86.     for ( i = 0; i < n_line; i++ ) {
  87.     sleep(1);
  88.     if ( sendto( plug,
  89.              line[i], 1+strlen(line[i]),
  90.              sendflags,
  91.              (struct sockaddr *)&socketname, sizeof socketname )
  92.          < 0 ) {
  93.         perror(argv[0]);
  94.         exit(__LINE__);
  95.     }
  96.     }
  97.     
  98.     /* all the socket connections are closed automatically */
  99.     exit(0);
  100. }
  101.