34 #include <sys/types.h>
35 #include <sys/socket.h>
41 #ifdef _ACCEPT_USES_SOCKLEN_T
42 #define SOCK_TYPE socklen_t
67 string err = (string)
"Already accepting connections, "
68 +
"no more sockets can be added" ;
85 string err(
"socket already connected, cannot listen" ) ;
90 string err(
"socket already listening" ) ;
103 struct timeval timeout ;
109 timeout.tv_sec = 120 ;
110 timeout.tv_usec = 0 ;
112 FD_ZERO( &read_fd ) ;
115 Socket_citer iter = _socket_list.begin() ;
116 for( ; iter != _socket_list.end(); iter++ )
118 Socket *s_ptr = (*iter).second ;
120 if( s > maxfd ) maxfd = s ;
121 FD_SET( s, &read_fd ) ;
129 while (select(maxfd + 1, &read_fd, (fd_set*) NULL, (fd_set*) NULL, &timeout) < 0) {
137 string err(
"select: ");
138 const char *error_info = strerror(errno);
140 err += (string) error_info;
146 iter = _socket_list.begin() ;
147 for( ; iter != _socket_list.end(); iter++ )
149 Socket *s_ptr = (*iter).second ;
151 if ( FD_ISSET( s, &read_fd ) )
153 struct sockaddr from ;
154 socklen_t len_from =
sizeof( from ) ;
156 while ((msgsock = ::
accept(s, &from, &len_from)) < 0) {
157 if (errno == EINTR) {
161 string err(
"accept: ");
162 const char *error_info = strerror(errno);
164 err += (string) error_info;
169 return s_ptr->
newSocket( msgsock, (
struct sockaddr *)&from ) ;
187 << (
void *)
this <<
")" << endl ;
189 if( _socket_list.size() )
192 Socket_citer i = _socket_list.begin() ;
193 Socket_citer ie = _socket_list.end() ;
194 for( ; i != ie; i++ )
197 Socket *s_ptr = (*i).second ;
198 s_ptr->
dump( strm ) ;
virtual bool isListening()
exception thrown if inernal error encountered
virtual bool isConnected()
virtual ~SocketListener()
virtual void dump(ostream &strm) const
dumps information about this object
virtual Socket * accept()
Use the select() system call to wait for an incoming connection.
static ostream & LMarg(ostream &strm)
virtual void dump(ostream &strm) const
dumps information about this object
virtual int getSocketDescriptor()
virtual void listen(Socket *s)
virtual Socket * newSocket(int socket, struct sockaddr *addr)=0