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