passivesock.c
上传用户:wei_4586
上传日期:2008-05-28
资源大小:18k
文件大小:2k
源码类别:

网络

开发平台:

Unix_Linux

  1. /* passivesock.c - passivesock */
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <netdb.h>
  8. extern int errno;
  9. int errexit(const char *format, ...);
  10. unsigned short portbase = 0; /* port base, for non-root servers */
  11. /*------------------------------------------------------------------------
  12.  * passivesock - allocate & bind a server socket using TCP or UDP
  13.  *------------------------------------------------------------------------
  14.  */
  15. int
  16. passivesock(const char *service, const char *transport, int qlen)
  17. /*
  18.  * Arguments:
  19.  *      service   - service associated with the desired port
  20.  *      transport - transport protocol to use ("tcp" or "udp")
  21.  *      qlen      - maximum server request queue length
  22.  */
  23. {
  24. struct servent *pse; /* pointer to service information entry */
  25. struct protoent *ppe; /* pointer to protocol information entry*/
  26. struct sockaddr_in sin; /* an Internet endpoint address */
  27. int s, type; /* socket descriptor and socket type */
  28. memset(&sin, 0, sizeof(sin));
  29. sin.sin_family = AF_INET;
  30. sin.sin_addr.s_addr = INADDR_ANY;
  31.     /* Map service name to port number */
  32. if ( pse = getservbyname(service, transport) )
  33. sin.sin_port = htons(ntohs((unsigned short)pse->s_port)
  34. + portbase);
  35. else if ((sin.sin_port=htons((unsigned short)atoi(service))) == 0)
  36. errexit("can't get "%s" service entryn", service);
  37.     /* Map protocol name to protocol number */
  38. if ( (ppe = getprotobyname(transport)) == 0)
  39. errexit("can't get "%s" protocol entryn", transport);
  40.     /* Use protocol to choose a socket type */
  41. if (strcmp(transport, "udp") == 0)
  42. type = SOCK_DGRAM;
  43. else
  44. type = SOCK_STREAM;
  45.     /* Allocate a socket */
  46. s = socket(PF_INET, type, ppe->p_proto);
  47. if (s < 0)
  48. errexit("can't create socket: %sn", strerror(errno));
  49.     /* Bind the socket */
  50. if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0)
  51. errexit("can't bind to %s port: %sn", service,
  52. strerror(errno));
  53. if (type == SOCK_STREAM && listen(s, qlen) < 0)
  54. errexit("can't listen on %s port: %sn", service,
  55. strerror(errno));
  56. return s;
  57. }