bind.c
上传用户:qunlip
上传日期:2007-01-04
资源大小:203k
文件大小:2k
源码类别:

代理服务器

开发平台:

Visual C++

  1. char *bind_rcs = "$Id: bind.c,v 2.9 1998/10/22 15:30:16 ACJC Exp $";
  2. /* Written and copyright 1997 Anonymous Coders and Junkbusters Corporation.
  3.  * Distributed under the GNU General Public License; see the README file.
  4.  * This code comes with NO WARRANTY. http://www.junkbusters.com/ht/en/gpl.html
  5.  */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <errno.h>
  10. #include <sys/types.h>
  11. #include <fcntl.h>
  12. #include <sys/stat.h>
  13. #ifdef _WIN32
  14. #include <io.h>
  15. #include <windows.h>
  16. #else
  17. #include <unistd.h>
  18. #include <netinet/in.h>
  19. #include <sys/ioctl.h>
  20. #include <netdb.h> 
  21. #include <sys/socket.h>
  22. #ifndef __BEOS__
  23. #include <netinet/tcp.h>
  24. #include <arpa/inet.h>
  25. #include <sys/signal.h>
  26. #endif
  27. #endif
  28. extern int atoip();
  29. long  remote_ip_long;
  30. char *remote_ip_str;
  31. /*
  32.  * BIND-PORT (portnum)
  33.  *  if success, return file descriptor
  34.  *  if failure, returns -2 if address is in use, otherwise -1
  35.  */
  36. int bind_port (hostnam, portnum)
  37. char *hostnam;
  38. int  portnum;
  39. {
  40. struct sockaddr_in inaddr;
  41. int fd;
  42. int     one = 1;
  43. memset ((char * ) &inaddr, '', sizeof inaddr);
  44. inaddr.sin_family      = AF_INET;
  45. inaddr.sin_addr.s_addr = atoip(hostnam);
  46. if(sizeof(inaddr.sin_port) == sizeof(short)) {
  47. inaddr.sin_port = htons(portnum);
  48. } else {
  49. inaddr.sin_port = htonl(portnum);
  50. }
  51. fd = socket(AF_INET, SOCK_STREAM, 0);
  52. if (fd < 0) {
  53. return(-1);
  54. }
  55. setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one));
  56. if (bind (fd, (struct sockaddr *)&inaddr, sizeof(inaddr)) < 0) {
  57. close (fd);
  58. #ifdef _WIN32
  59. if (errno == WSAEADDRINUSE)
  60. #else
  61. if (errno == EADDRINUSE)
  62. #endif
  63. {
  64. return(-2);
  65. } else {
  66. return(-1);
  67. }
  68. }
  69. while (listen(fd, 5) == -1) {
  70. if (errno != EINTR) {
  71. return(-1);
  72. }
  73. }
  74. return fd;
  75. }
  76. /* 
  77.  * ACCEPT-CONNECTION
  78.  * the argument, fd, is the value returned from bind_port
  79.  *
  80.  * when a connection is accepted, it returns the file descriptor
  81.  * for the connected port
  82.  */
  83. int accept_connection (fd)
  84. int fd;
  85. {
  86. struct sockaddr raddr;
  87. struct sockaddr_in *rap = (struct sockaddr_in *) &raddr;
  88. int afd, raddrlen;
  89. raddrlen = sizeof raddr;
  90. do {
  91. afd = accept (fd, &raddr, &raddrlen);
  92. } while (afd < 1 && errno == EINTR);
  93. if (afd < 0) {
  94. return(-1);
  95. }
  96. remote_ip_str  = strdup(inet_ntoa(rap->sin_addr));
  97. remote_ip_long = ntohl(rap->sin_addr.s_addr);
  98. return afd;
  99. }