passivesock.c
上传用户:wei_4586
上传日期:2008-05-28
资源大小:18k
文件大小:2k
- /* passivesock.c - passivesock */
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <stdlib.h>
- #include <string.h>
- #include <netdb.h>
- extern int errno;
- int errexit(const char *format, ...);
- unsigned short portbase = 0; /* port base, for non-root servers */
- /*------------------------------------------------------------------------
- * passivesock - allocate & bind a server socket using TCP or UDP
- *------------------------------------------------------------------------
- */
- int
- passivesock(const char *service, const char *transport, int qlen)
- /*
- * Arguments:
- * service - service associated with the desired port
- * transport - transport protocol to use ("tcp" or "udp")
- * qlen - maximum server request queue length
- */
- {
- struct servent *pse; /* pointer to service information entry */
- struct protoent *ppe; /* pointer to protocol information entry*/
- struct sockaddr_in sin; /* an Internet endpoint address */
- int s, type; /* socket descriptor and socket type */
- memset(&sin, 0, sizeof(sin));
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = INADDR_ANY;
- /* Map service name to port number */
- if ( pse = getservbyname(service, transport) )
- sin.sin_port = htons(ntohs((unsigned short)pse->s_port)
- + portbase);
- else if ((sin.sin_port=htons((unsigned short)atoi(service))) == 0)
- errexit("can't get "%s" service entryn", service);
- /* Map protocol name to protocol number */
- if ( (ppe = getprotobyname(transport)) == 0)
- errexit("can't get "%s" protocol entryn", transport);
- /* Use protocol to choose a socket type */
- if (strcmp(transport, "udp") == 0)
- type = SOCK_DGRAM;
- else
- type = SOCK_STREAM;
- /* Allocate a socket */
- s = socket(PF_INET, type, ppe->p_proto);
- if (s < 0)
- errexit("can't create socket: %sn", strerror(errno));
- /* Bind the socket */
- if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0)
- errexit("can't bind to %s port: %sn", service,
- strerror(errno));
- if (type == SOCK_STREAM && listen(s, qlen) < 0)
- errexit("can't listen on %s port: %sn", service,
- strerror(errno));
- return s;
- }