socket_network_client.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /* libs/cutils/socket_network_client.c
  2. **
  3. ** Copyright 2006, The Android Open Source Project
  4. **
  5. ** Licensed under the Apache License, Version 2.0 (the "License");
  6. ** you may not use this file except in compliance with the License.
  7. ** You may obtain a copy of the License at
  8. **
  9. ** http://www.apache.org/licenses/LICENSE-2.0
  10. **
  11. ** Unless required by applicable law or agreed to in writing, software
  12. ** distributed under the License is distributed on an "AS IS" BASIS,
  13. ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. ** See the License for the specific language governing permissions and
  15. ** limitations under the License.
  16. */
  17. #include <cutils/sockets.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <unistd.h>
  21. #include <errno.h>
  22. #include <stddef.h>
  23. #ifndef HAVE_WINSOCK
  24. #include <sys/socket.h>
  25. #include <sys/select.h>
  26. #include <sys/types.h>
  27. #include <netinet/in.h>
  28. #include <netdb.h>
  29. #endif
  30. /* Connect to port on the IP interface. type is
  31. * SOCK_STREAM or SOCK_DGRAM.
  32. * return is a file descriptor or -1 on error
  33. */
  34. int socket_network_client(const char *host, int port, int type)
  35. {
  36. struct hostent *hp;
  37. struct sockaddr_in addr;
  38. socklen_t alen;
  39. int s;
  40. hp = gethostbyname(host);
  41. if(hp == 0) return -1;
  42. memset(&addr, 0, sizeof(addr));
  43. addr.sin_family = hp->h_addrtype;
  44. addr.sin_port = htons(port);
  45. memcpy(&addr.sin_addr, hp->h_addr, hp->h_length);
  46. s = socket(hp->h_addrtype, type, 0);
  47. if(s < 0) return -1;
  48. if(connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
  49. close(s);
  50. return -1;
  51. }
  52. return s;
  53. }