40 #include <sys/types.h>
41 #include <sys/socket.h>
47 #include <sys/select.h>
49 #include "SocketListener.h"
50 #include "BESInternalError.h"
52 #include "SocketConfig.h"
60 SocketListener::SocketListener() :
65 SocketListener::~SocketListener()
69 void SocketListener::listen(
Socket *s)
72 throw BESInternalError(
"Already accepting connections, no more sockets can be added", __FILE__, __LINE__);
74 if (s && !s->isConnected() && !s->isListening()) {
76 _socket_list[s->getSocketDescriptor()] = s;
81 else if (s->isConnected())
82 throw BESInternalError(
"socket already connected, cannot listen", __FILE__, __LINE__);
83 else if (s->isListening())
92 BESDEBUG(
"ppt",
"SocketListener::accept() - START" << endl);
98 for (Socket_citer i = _socket_list.begin(), e = _socket_list.end(); i != e; i++) {
99 Socket *s_ptr = (*i).second;
100 if (s_ptr->getSocketDescriptor() > maxfd) maxfd = s_ptr->getSocketDescriptor();
101 FD_SET(s_ptr->getSocketDescriptor(), &read_fd);
104 struct timeval timeout;
105 timeout.tv_sec = 120;
107 int status = select(maxfd + 1, &read_fd, (fd_set*) NULL, (fd_set*) NULL, &timeout);
113 BESDEBUG(
"ppt2",
"SocketListener::accept() - select encountered EAGAIN" << endl);
120 BESDEBUG(
"ppt2",
"SocketListener::accept() - select encountered EINTR" << endl);
124 throw BESInternalError(
string(
"select: ") + strerror(errno), __FILE__, __LINE__);
128 BESDEBUG(
"ppt",
"SocketListener::accept() - select() completed without error." << endl);
130 for (Socket_citer i = _socket_list.begin(), e = _socket_list.end(); i != e; i++) {
131 Socket *s_ptr = (*i).second;
132 if (FD_ISSET( s_ptr->getSocketDescriptor(), &read_fd )) {
133 struct sockaddr from;
134 socklen_t len_from =
sizeof(from);
136 BESDEBUG(
"ppt",
"SocketListener::accept() - Attempting to accept on "<< s_ptr->getIp() <<
":"
137 << s_ptr->getPort() << endl);
140 while ((msgsock = ::
accept(s_ptr->getSocketDescriptor(), &from, &len_from)) < 0) {
141 if (errno == EINTR) {
145 throw BESInternalError(
string(
"accept: ") + strerror(errno), __FILE__, __LINE__);
149 BESDEBUG(
"ppt",
"SocketListener::accept() - END (returning new Socket)" << endl);
150 return s_ptr->newSocket(msgsock, (
struct sockaddr *) &from);
154 BESDEBUG(
"ppt",
"SocketListener::accept() - END (returning 0)" << endl);
166 strm << BESIndent::LMarg <<
"SocketListener::dump - (" << (
void *)
this <<
")" << endl;
168 if (_socket_list.size()) {
169 strm << BESIndent::LMarg <<
"registered sockets:" << endl;
170 Socket_citer i = _socket_list.begin();
171 Socket_citer ie = _socket_list.end();
172 for (; i != ie; i++) {
173 strm << BESIndent::LMarg <<
"socket: " << (*i).first;
174 Socket *s_ptr = (*i).second;
179 strm << BESIndent::LMarg <<
"registered sockets: none" << endl;
181 BESIndent::UnIndent();