00001
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;
00011
00012
00013
00014
00015
00016 SOCKET
00017 passivesock(const char *service, const char *transport, int qlen)
00018 {
00019 struct servent *pse;
00020 struct protoent *ppe;
00021 struct sockaddr_in sin;
00022 SOCKET s;
00023 int type;
00024
00025 memset(&sin, 0, sizeof(sin));
00026 sin.sin_family = AF_INET;
00027 sin.sin_addr.s_addr = INADDR_ANY;
00028
00029
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
00037 if ( (ppe = getprotobyname(transport)) == 0)
00038 errexit("can't get \"%s\" protocol entry\n", transport);
00039
00040
00041 if (strcmp(transport, "udp") == 0)
00042 type = SOCK_DGRAM;
00043 else
00044 type = SOCK_STREAM;
00045
00046
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
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 }