home *** CD-ROM | disk | FTP | other *** search
/ ftp.ncftp.com / ftp.ncftp.com.zip / ftp.ncftp.com / libncftp / libncftp-3.2.5-src.zip / libncftp-3.2.5 / sio / SBind.c < prev    next >
C/C++ Source or Header  |  2001-11-19  |  2KB  |  67 lines

  1. #include "syshdrs.h"
  2. #ifdef PRAGMA_HDRSTOP
  3. #    pragma hdrstop
  4. #endif
  5.  
  6. int
  7. SBind(int sockfd, const int port, const int nTries, const int reuseFlag)
  8. {
  9.     unsigned int i;
  10.     int on;
  11.     sockopt_size_t onsize;
  12.     struct sockaddr_in localAddr;
  13.  
  14.     localAddr.sin_family = AF_INET;
  15.     localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  16.     localAddr.sin_port = htons((unsigned short) port);
  17.  
  18.     if (reuseFlag != kReUseAddrNo) {
  19.         /* This is mostly so you can quit the server and re-run it
  20.          * again right away.  If you don't do this, the OS may complain
  21.          * that the address is still in use.
  22.          */
  23.         on = 1;
  24.         onsize = (sockopt_size_t) sizeof(on);
  25.         (void) setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,
  26.             SETSOCKOPT_ARG4 &on, onsize);
  27.  
  28. #ifdef SO_REUSEPORT
  29.         /* Tells kernel that it's okay to have more
  30.          * than one process originating from this
  31.          * local port.
  32.          */
  33.         on = 1;
  34.         onsize = (sockopt_size_t) sizeof(on);
  35.         (void) setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT,
  36.             SETSOCKOPT_ARG4 &on, onsize);
  37. #endif    /* SO_REUSEPORT */
  38.     }
  39.  
  40.     for (i=1; ; i++) {
  41.         /* Try binding a few times, in case we get Address in Use
  42.          * errors.
  43.          */
  44.         if (bind(sockfd, (struct sockaddr *) &localAddr, (sockaddr_size_t) sizeof(struct sockaddr_in)) == 0) {
  45.             break;
  46.         }
  47.         if ((int) i == nTries) {
  48.             return (-1);
  49.         }
  50.         /* Give the OS time to clean up the old socket,
  51.          * and then try again.
  52.          */
  53.         sleep(i * 3);
  54.     }
  55.  
  56.     return (0);
  57. }    /* SBind */
  58.  
  59.  
  60.  
  61.  
  62. int
  63. SListen(int sfd, int backlog)
  64. {
  65.     return (listen(sfd, (listen_backlog_t) backlog));
  66. }    /* SListen */
  67.