home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-386-Vol-2of3.iso / x / xhearts.zip / OPENSOCK.C < prev    next >
C/C++ Source or Header  |  1992-01-07  |  2KB  |  72 lines

  1. /*
  2.  * opensock.c
  3.  *
  4.  * server creates a socket to listen for connections
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include "defs.h"
  9. #include "local.h"
  10.  
  11.  
  12. /*
  13.  * Open main socket on given port and set sock_num to it.
  14.  * If port is 0, get port from /etc/services.
  15.  */
  16. open_socket(port)
  17. int    port;
  18. {
  19.     struct    sockaddr_in sockaddr;
  20.     struct    hostent *host;
  21.     struct    servent *distributor;
  22.     int    sock_num;
  23.     char    hostnm[SLEN];
  24.  
  25.     (void) gethostname(hostnm, SLEN);
  26.     if ((sock_num = socket(AF_INET, SOCK_STREAM, 0)) < 0)  {
  27.         perror("socket");
  28.         exit(1);
  29.     }
  30.     if ((host = gethostbyname(hostnm)) == NULL)  {
  31.         perror("gethostbyname");
  32.         exit(1);
  33.     }
  34.     bzero((char *) &sockaddr, sizeof (sockaddr));
  35.     bcopy(host->h_addr, (char *) &sockaddr.sin_addr, host->h_length);
  36.     sockaddr.sin_family = AF_INET;
  37.     if (port)
  38.         sockaddr.sin_port = htons(port);
  39.     else {
  40.         if ((distributor = getservbyname(SERVICE, PROTO)) == NULL)  {
  41.             fputs("hearts: service not found\n", stderr);
  42.             exit(1);
  43.         }
  44.         sockaddr.sin_port = distributor->s_port;
  45.     }
  46.     /*
  47.      * Allow reuse of local addresses.
  48.      * Speeds up reinvocation of distributor.
  49.      */
  50.     (void) setsockopt(sock_num, SOL_SOCKET, SO_REUSEADDR, (char *) 0, 0);
  51.     /*
  52.      * Don't hang around if socket in use.
  53.      */
  54. #ifdef SO_DONTLINGER
  55.     (void) setsockopt(sock_num, SOL_SOCKET, SO_DONTLINGER, (char *) 0, 0);
  56. #else
  57.     {
  58.         struct linger ling;
  59.  
  60.         (void) setsockopt(sock_num, SOL_SOCKET, SO_LINGER, (char *) &ling, 0);
  61.     }
  62. #endif
  63.     if (bind(sock_num, (struct sockaddr *) &sockaddr, sizeof(sockaddr)) < 0)  {
  64.         return(0);
  65.     }
  66.     if ((listen(sock_num, 5)) == -1)  {
  67.         perror("listen");
  68.         exit(1);
  69.     }
  70.     return(sock_num);
  71. }
  72.