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

网络

开发平台:

Unix_Linux

  1. /* connectsock.c - connectsock */
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <arpa/inet.h>
  6. #include <netdb.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9. #ifndef INADDR_NONE
  10. #define INADDR_NONE 0xffffffff
  11. #endif /* INADDR_NONE */
  12. extern int errno;
  13. int errexit(const char *format, ...);
  14. /*------------------------------------------------------------------------
  15.  * connectsock - allocate & connect a socket using TCP or UDP
  16.  *------------------------------------------------------------------------
  17.  */
  18. int
  19. connectsock(const char *host, const char *service, const char *transport )
  20. /*
  21.  * Arguments:
  22.  *      host      - name of host to which connection is desired
  23.  *      service   - service associated with the desired port
  24.  *      transport - name of transport protocol to use ("tcp" or "udp")
  25.  */
  26. {
  27. struct hostent *phe; /* pointer to host information entry */
  28. struct servent *pse; /* pointer to service information entry */
  29. struct protoent *ppe; /* pointer to protocol information entry*/
  30. struct sockaddr_in sin; /* an Internet endpoint address */
  31. int s, type; /* socket descriptor and socket type */
  32. memset(&sin, 0, sizeof(sin));
  33. sin.sin_family = AF_INET;
  34.     /* Map service name to port number */
  35. if ( pse = getservbyname(service, transport) )
  36. sin.sin_port = pse->s_port;
  37. else if ((sin.sin_port=htons((unsigned short)atoi(service))) == 0)
  38. errexit("can't get "%s" service entryn", service);
  39.     /* Map host name to IP address, allowing for dotted decimal */
  40. if ( phe = gethostbyname(host) )
  41. memcpy(&sin.sin_addr, phe->h_addr, phe->h_length);
  42. else if ( (sin.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE )
  43. errexit("can't get "%s" host entryn", host);
  44.     /* Map transport protocol name to protocol number */
  45. if ( (ppe = getprotobyname(transport)) == 0)
  46. errexit("can't get "%s" protocol entryn", transport);
  47.     /* Use protocol to choose a socket type */
  48. if (strcmp(transport, "udp") == 0)
  49. type = SOCK_DGRAM;
  50. else
  51. type = SOCK_STREAM;
  52.     /* Allocate a socket */
  53. s = socket(PF_INET, type, ppe->p_proto);
  54. if (s < 0)
  55. errexit("can't create socket: %sn", strerror(errno));
  56.     /* Connect the socket */
  57. if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0)
  58. errexit("can't connect to %s.%s: %sn", host, service,
  59. strerror(errno));
  60. return s;
  61. }