41#include <sys/socket.h>
47#include <sys/select.h>
49#include "SocketListener.h"
50#include "BESInternalError.h"
52#include "SocketConfig.h"
61#define prolog string("SocketListener::").append(__func__).append("() - ")
63SocketListener::SocketListener() :
68SocketListener::~SocketListener()
72void SocketListener::listen(
Socket *s)
75 throw BESInternalError(
"Already accepting connections, no more sockets can be added", __FILE__, __LINE__);
77 if (s && !s->isConnected() && !s->isListening()) {
79 _socket_list[s->getSocketDescriptor()] = s;
84 else if (s->isConnected())
85 throw BESInternalError(
"socket already connected, cannot listen", __FILE__, __LINE__);
86 else if (s->isListening())
95 BESDEBUG(MODULE, prolog <<
"START" << endl);
101 for (Socket_citer i = _socket_list.begin(), e = _socket_list.end(); i != e; i++) {
102 Socket *s_ptr = (*i).second;
103 if (s_ptr->getSocketDescriptor() > maxfd) maxfd = s_ptr->getSocketDescriptor();
104 FD_SET(s_ptr->getSocketDescriptor(), &read_fd);
107 struct timeval timeout;
108 timeout.tv_sec = 120;
110 int status = select(maxfd + 1, &read_fd, (fd_set*) NULL, (fd_set*) NULL, &timeout);
116 BESDEBUG(MODULE, prolog <<
"select() encountered EAGAIN" << endl);
123 BESDEBUG(MODULE, prolog <<
"select() encountered EINTR" << endl);
127 throw BESInternalError(
string(
"select(): ") + strerror(errno), __FILE__, __LINE__);
131 BESDEBUG(MODULE, prolog <<
"select() completed without error." << endl);
133 for (Socket_citer i = _socket_list.begin(), e = _socket_list.end(); i != e; i++) {
134 Socket *s_ptr = (*i).second;
135 if (FD_ISSET( s_ptr->getSocketDescriptor(), &read_fd )) {
136 struct sockaddr from;
137 socklen_t len_from =
sizeof(from);
139 BESDEBUG(MODULE, prolog <<
"Attempting to accept on "<< s_ptr->getIp() <<
":"
140 << s_ptr->getPort() << endl);
143 while ((msgsock =
::accept(s_ptr->getSocketDescriptor(), &from, &len_from)) < 0) {
144 if (errno == EINTR) {
148 throw BESInternalError(
string(
"accept: ") + strerror(errno), __FILE__, __LINE__);
152 BESDEBUG(MODULE, prolog <<
"END (returning new Socket)" << endl);
153 return s_ptr->newSocket(msgsock, (
struct sockaddr *) &from);
157 BESDEBUG(MODULE, prolog <<
"END (returning 0)" << endl);
169 strm << BESIndent::LMarg <<
"SocketListener::dump - (" << (
void *)
this <<
")" << endl;
171 if (_socket_list.size()) {
172 strm << BESIndent::LMarg <<
"registered sockets:" << endl;
173 Socket_citer i = _socket_list.begin();
174 Socket_citer ie = _socket_list.end();
175 for (; i != ie; i++) {
176 strm << BESIndent::LMarg <<
"socket: " << (*i).first;
177 Socket *s_ptr = (*i).second;
182 strm << BESIndent::LMarg <<
"registered sockets: none" << endl;
184 BESIndent::UnIndent();
exception thrown if internal error encountered
virtual void dump(std::ostream &strm) const
dumps information about this object
virtual Socket * accept()
virtual void dump(std::ostream &strm) const
dumps information about this object