34 #include <sys/types.h> 35 #include <sys/socket.h> 41 #include <sys/select.h> 46 #include "SocketListener.h" 47 #include "BESInternalError.h" 49 #include "SocketConfig.h" 55 SocketListener::SocketListener() :
60 SocketListener::~SocketListener()
64 void SocketListener::listen(
Socket *s)
67 throw BESInternalError(
"Already accepting connections, no more sockets can be added", __FILE__, __LINE__);
69 if (s && !s->isConnected() && !s->isListening()) {
71 _socket_list[s->getSocketDescriptor()] = s;
76 else if (s->isConnected())
77 throw BESInternalError(
"socket already connected, cannot listen", __FILE__, __LINE__);
78 else if (s->isListening())
87 BESDEBUG(
"ppt",
"SocketListener::accept() - START" << endl);
93 for (Socket_citer i = _socket_list.begin(), e = _socket_list.end(); i != e; i++) {
94 Socket *s_ptr = (*i).second;
95 if (s_ptr->getSocketDescriptor() > maxfd) maxfd = s_ptr->getSocketDescriptor();
96 FD_SET(s_ptr->getSocketDescriptor(), &read_fd);
99 struct timeval timeout;
100 timeout.tv_sec = 120;
102 int status = select(maxfd + 1, &read_fd, (fd_set*) NULL, (fd_set*) NULL, &timeout);
108 BESDEBUG(
"ppt2",
"SocketListener::accept() - select encountered EAGAIN" << endl);
115 BESDEBUG(
"ppt2",
"SocketListener::accept() - select encountered EINTR" << endl);
119 throw BESInternalError(
string(
"select: ") + strerror(errno), __FILE__, __LINE__);
123 BESDEBUG(
"ppt",
"SocketListener::accept() - select() completed without error." << endl);
125 for (Socket_citer i = _socket_list.begin(), e = _socket_list.end(); i != e; i++) {
126 Socket *s_ptr = (*i).second;
127 if (FD_ISSET( s_ptr->getSocketDescriptor(), &read_fd )) {
128 struct sockaddr from;
129 socklen_t len_from =
sizeof(from);
131 BESDEBUG(
"ppt",
"SocketListener::accept() - Attempting to accept on "<< s_ptr->getIp() <<
":" 132 << s_ptr->getPort() << endl);
135 while ((msgsock = ::accept(s_ptr->getSocketDescriptor(), &from, &len_from)) < 0) {
136 if (errno == EINTR) {
140 throw BESInternalError(
string(
"accept: ") + strerror(errno), __FILE__, __LINE__);
144 BESDEBUG(
"ppt",
"SocketListener::accept() - END (returning new Socket)" << endl);
145 return s_ptr->newSocket(msgsock, (
struct sockaddr *) &from);
149 BESDEBUG(
"ppt",
"SocketListener::accept() - END (returning 0)" << endl);
161 strm << BESIndent::LMarg <<
"SocketListener::dump - (" << (
void *)
this <<
")" << endl;
163 if (_socket_list.size()) {
164 strm << BESIndent::LMarg <<
"registered sockets:" << endl;
165 Socket_citer i = _socket_list.begin();
166 Socket_citer ie = _socket_list.end();
167 for (; i != ie; i++) {
168 strm << BESIndent::LMarg <<
"socket: " << (*i).first;
169 Socket *s_ptr = (*i).second;
174 strm << BESIndent::LMarg <<
"registered sockets: none" << endl;
176 BESIndent::UnIndent();
exception thrown if inernal error encountered
virtual Socket * accept()
virtual void dump(ostream &strm) const
dumps information about this object
virtual void dump(ostream &strm) const
dumps information about this object