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

  1. /* sockl.c -- set up an INTERNET DGRAM socket and listen on it */
  2. /* (C) 1991 Blair P. Houghton, All Rights Reserved, copying and */
  3. /* distribution permitted with copyright intact.        */
  4.  
  5. /* a DGRAM receiver is thoroughly independent of the sender */
  6.  
  7. #include <stdio.h>
  8. #include <sys/types.h>
  9. #include <sys/socket.h>
  10. #include <netinet/in.h>
  11. #include <fcntl.h>
  12.  
  13. #ifdef __STDC__
  14. extern void    exit( int );
  15. extern void    perror( char * );
  16. extern int    printf( char *, ... );
  17. extern int    bind( int, struct sockaddr *, int );
  18. extern int    socket( int, int, int );
  19. extern int    read( int, char *, unsigned );
  20. extern char *    strcpy( char *, char *b );
  21. extern int    fcntl( int, int, int );
  22. extern int    accept( int, struct sockaddr *, int * );
  23. extern int    listen( int, int );
  24. extern int    unlink( char * );
  25. extern int    getsockname( int, struct sockaddr *, int * );
  26. extern int    recvfrom( int, char *, int, int, struct sockaddr *, int );
  27.  
  28. void main( int argc, char *argv[] )
  29. #else
  30. main( argc, argv )
  31. int argc; char *argv[];
  32. #endif
  33. {
  34.     int sock;                /* fd for the socket */
  35.     struct sockaddr_in sockaddr;    /* sytem's location of the socket */
  36.     struct sockaddr_in caller;        /* id of foreign calling process */
  37.     int sockaddr_in_length = sizeof(struct sockaddr_in);
  38.     char buf[BUFSIZ];
  39.     int read_ret;
  40.     int fromlen = sizeof(struct sockaddr_in);
  41.     char acknowledgement[BUFSIZ];
  42.  
  43.     /*
  44.      *  open a net socket, using dgram (packetized, nonconnected)
  45.      *  mode, with protocol irrelevant ( == 0 )
  46.      */
  47.     if ( (sock = socket( AF_INET, SOCK_DGRAM, 0 )) < 0 ) {
  48.     char s[BUFSIZ];
  49.     sprintf( s, "%s: can't assign fd for socket", argv[0] );
  50.     perror(s);
  51.     exit(__LINE__);
  52.     }
  53.  
  54.    /*
  55.     *  register the socket
  56.     */
  57.     sockaddr.sin_family = AF_INET;
  58.     sockaddr.sin_addr.s_addr = INADDR_ANY;    /* not choosy about who calls */
  59.     sockaddr.sin_port = 0;            /* ??? why 0? */
  60.  
  61.     if ( bind( sock, (struct sockaddr *) &sockaddr, sizeof sockaddr ) < 0 ) {
  62.     char s[BUFSIZ];
  63.     sprintf( s, "%s: can't bind socket (%d)", argv[0], sock );
  64.     perror(s);
  65.     exit(__LINE__);
  66.     }
  67.  
  68.    /*
  69.     *  get port number
  70.     */
  71.     if ( getsockname(sock, (struct sockaddr *) &sockaddr, (int *)&sockaddr_in_length)
  72.      < 0 ) {
  73.     char s[BUFSIZ];
  74.     sprintf( s, "%s: can't get port number of socket (%d)",
  75.         argv[0], sock );
  76.     perror(s);
  77.     exit(__LINE__);
  78.     }
  79.  
  80.     printf("opened socket as fd (%d) on port (%d) for dgram i/o\n",
  81.         sock, ntohs(sockaddr.sin_port) );
  82.  
  83.     printf(
  84. "struct sockaddr_in {\n\
  85.     sin_family        = %d\n\
  86.     sin_addr.s_addr    = %d\n\
  87.     sin_port        = %d\n\
  88. } sockaddr;\n"
  89. , sockaddr.sin_family
  90. , sockaddr.sin_addr.s_addr
  91. , ntohs(sockaddr.sin_port)
  92.     );
  93.     fflush(stdout);
  94.  
  95.     /* read and print lines until the cows come home */
  96.     while ( (read_ret = recvfrom( sock, buf, sizeof buf,
  97.                   0, (struct sockaddr *) &caller,
  98.                   sizeof caller)
  99.         ) > 0 ) {
  100.     printf( "%s: read (from caller (%s, %d)) socket as follows:\n(%s)\n",
  101.         argv[0],
  102.         inet_ntoa(caller.sin_addr),
  103.         ntohs(caller.sin_port),
  104.         buf ); 
  105.     fflush(stdout);
  106.     }
  107.  
  108.     if ( read_ret < 0 ) {
  109.     char s[BUFSIZ];
  110.     sprintf( s, "%s: error reading socket", argv[0] );
  111.     perror(s);
  112.     exit(__LINE__);
  113.     }
  114.  
  115.     /* loop ended normally:  read() returned NULL */
  116.     exit(0);
  117. }
  118.