server/passsock.cpp

Go to the documentation of this file.
00001 /* passsock.cpp - passivesock */
00002 
00003 #include <windows.h>
00004 #include <stdlib.h>
00005 #include <string.h>
00006 #include <winsock.h>
00007 
00008 void    errexit(const char *, ...);
00009 
00010 u_short portbase = 0;           /* port base, for test servers          */
00011 
00012 /*------------------------------------------------------------------------
00013  * passivesock - allocate & bind a server socket using TCP or UDP
00014  *------------------------------------------------------------------------
00015  */
00016 SOCKET
00017 passivesock(const char *service, const char *transport, int qlen)
00018 {
00019         struct servent  *pse;   /* pointer to service information entry */
00020         struct protoent *ppe;   /* pointer to protocol information entry*/
00021         struct sockaddr_in sin; /* an Internet endpoint address         */
00022         SOCKET          s;      /* socket descriptor                    */
00023         int             type;   /* socket type (SOCK_STREAM, SOCK_DGRAM)*/
00024 
00025         memset(&sin, 0, sizeof(sin));
00026         sin.sin_family = AF_INET;
00027         sin.sin_addr.s_addr = INADDR_ANY;
00028 
00029     /* Map service name to port number */
00030         if ( pse = getservbyname(service, transport) )
00031                 sin.sin_port = htons(ntohs((u_short)pse->s_port)
00032                         + portbase);
00033         else if ( (sin.sin_port = htons((u_short)atoi(service))) == 0 )
00034                 errexit("can't get \"%s\" service entry\n", service);
00035 
00036     /* Map protocol name to protocol number */
00037         if ( (ppe = getprotobyname(transport)) == 0)
00038                 errexit("can't get \"%s\" protocol entry\n", transport);
00039 
00040     /* Use protocol to choose a socket type */
00041         if (strcmp(transport, "udp") == 0)
00042                 type = SOCK_DGRAM;
00043         else
00044                 type = SOCK_STREAM;
00045 
00046     /* Allocate a socket */
00047         s = socket(PF_INET, type, ppe->p_proto);
00048         if (s == INVALID_SOCKET)
00049                 errexit("can't create socket: %d\n", GetLastError());
00050 
00051     /* Bind the socket */
00052         if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR)
00053                 errexit("can't bind to %s port: %d\n", service,
00054                         GetLastError());
00055         if (type == SOCK_STREAM && listen(s, qlen) == SOCKET_ERROR)
00056                 errexit("can't listen on %s port: %d\n", service,
00057                         GetLastError());
00058         return s;
00059 }

Generated on Sat Apr 1 21:30:47 2006 for Motion Planning Kernel by  doxygen 1.4.6-NO