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 >
Wrap
C/C++ Source or Header
|
1992-01-07
|
2KB
|
72 lines
/*
* opensock.c
*
* server creates a socket to listen for connections
*/
#include <stdio.h>
#include "defs.h"
#include "local.h"
/*
* Open main socket on given port and set sock_num to it.
* If port is 0, get port from /etc/services.
*/
open_socket(port)
int port;
{
struct sockaddr_in sockaddr;
struct hostent *host;
struct servent *distributor;
int sock_num;
char hostnm[SLEN];
(void) gethostname(hostnm, SLEN);
if ((sock_num = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
exit(1);
}
if ((host = gethostbyname(hostnm)) == NULL) {
perror("gethostbyname");
exit(1);
}
bzero((char *) &sockaddr, sizeof (sockaddr));
bcopy(host->h_addr, (char *) &sockaddr.sin_addr, host->h_length);
sockaddr.sin_family = AF_INET;
if (port)
sockaddr.sin_port = htons(port);
else {
if ((distributor = getservbyname(SERVICE, PROTO)) == NULL) {
fputs("hearts: service not found\n", stderr);
exit(1);
}
sockaddr.sin_port = distributor->s_port;
}
/*
* Allow reuse of local addresses.
* Speeds up reinvocation of distributor.
*/
(void) setsockopt(sock_num, SOL_SOCKET, SO_REUSEADDR, (char *) 0, 0);
/*
* Don't hang around if socket in use.
*/
#ifdef SO_DONTLINGER
(void) setsockopt(sock_num, SOL_SOCKET, SO_DONTLINGER, (char *) 0, 0);
#else
{
struct linger ling;
(void) setsockopt(sock_num, SOL_SOCKET, SO_LINGER, (char *) &ling, 0);
}
#endif
if (bind(sock_num, (struct sockaddr *) &sockaddr, sizeof(sockaddr)) < 0) {
return(0);
}
if ((listen(sock_num, 5)) == -1) {
perror("listen");
exit(1);
}
return(sock_num);
}