crossroads

Git mirror of https://crossroads.e-tunity.com/
git clone git://git.finwo.net/app/crossroads
Log | Files | Refs | LICENSE

bind.cc (1310B)


      1 #include "basesocket"
      2 
      3 void Basesocket::bind(string const &addr, int port) {
      4     // Make socket reusable.
      5     int val = 1;
      6     if (setsockopt (fd(), SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val))) {
      7 	ostringstream o;
      8 	o << "Failed to set reuse socket options on fd " << fd()
      9 	  << ": " << strerror(errno);
     10 	throw Error(o.str());
     11     }
     12 
     13     // Prepare binding.
     14     struct sockaddr_in saddr;
     15     memset (&saddr, 0, sizeof(saddr));
     16     saddr.sin_family = AF_INET;
     17     saddr.sin_port = htons(port);
     18 
     19     // Assign interface to listen to
     20     if (addr[0] != '0') {
     21         debugmsg ("Binding socket " << fd() << " to specific IP address " <<
     22 		  addr << '\n');
     23         if ( (saddr.sin_addr.s_addr = inet_addr (addr.c_str())) ==
     24 	     INADDR_NONE )
     25             throw Error("Cannot convert IP " + addr + " to network bytes");
     26     } else {
     27         debugmsg ("Binding socket " << fd() << " to all local IP addresses\n");
     28         saddr.sin_addr.s_addr = htonl (INADDR_ANY);
     29     }
     30     
     31     // Bind and listen
     32     if (::bind (fd(), (sockaddr*) &saddr, sizeof(saddr)) < 0)
     33         throw Error(string("Failed to bind to IP/port: ") + strerror(errno));
     34     if (listen (fd(), 5) < 0)
     35 	throw Error(string("Failed to listen to IP/port: ")
     36 		    + strerror(errno));
     37     msg("Listening for activity on fd " << fd() << '\n');
     38 }
     39 
     40