5
#include <boost/lexical_cast.hpp>
10
using namespace boost;
13
static FDMultiplexer* make()
15
return new SelectFDMultiplexer();
18
static struct RegisterOurselves
21
FDMultiplexer::getMultiplexerMap().insert(make_pair(1, &make));
25
void SelectFDMultiplexer::addFD(callbackmap_t& cbmap, int fd, callbackfunc_t toDo, const boost::any& parameter)
29
cb.d_parameter=parameter;
30
memset(&cb.d_ttd, 0, sizeof(cb.d_ttd));
32
throw FDMultiplexerException("Tried to add fd "+lexical_cast<string>(fd)+ " to multiplexer twice");
36
void SelectFDMultiplexer::removeFD(callbackmap_t& cbmap, int fd)
38
if(d_inrun && d_iter->first==fd) // trying to remove us!
42
throw FDMultiplexerException("Tried to remove unlisted fd "+lexical_cast<string>(fd)+ " from multiplexer");
45
int SelectFDMultiplexer::run(struct timeval* now)
48
throw FDMultiplexerException("FDMultiplexer::run() is not reentrant!\n");
50
fd_set readfds, writefds;
56
for(callbackmap_t::const_iterator i=d_readCallbacks.begin(); i != d_readCallbacks.end(); ++i) {
57
FD_SET(i->first, &readfds);
58
fdmax=max(i->first, fdmax);
61
for(callbackmap_t::const_iterator i=d_writeCallbacks.begin(); i != d_writeCallbacks.end(); ++i) {
62
FD_SET(i->first, &writefds);
63
fdmax=max(i->first, fdmax);
66
struct timeval tv={0,500000};
67
int ret=select(fdmax + 1, &readfds, &writefds, 0, &tv);
68
Utility::gettimeofday(now, 0);
70
if(ret < 0 && errno!=EINTR)
71
throw FDMultiplexerException("select returned error: "+stringerror());
76
d_iter=d_readCallbacks.end();
79
for(callbackmap_t::iterator i=d_readCallbacks.begin(); i != d_readCallbacks.end() && i->first <= fdmax; ) {
82
if(FD_ISSET(d_iter->first, &readfds)) {
83
d_iter->second.d_callback(d_iter->first, d_iter->second.d_parameter);
87
for(callbackmap_t::iterator i=d_writeCallbacks.begin(); i != d_writeCallbacks.end() && i->first <= fdmax; ) {
89
if(FD_ISSET(d_iter->first, &writefds)) {
90
d_iter->second.d_callback(d_iter->first, d_iter->second.d_parameter);
100
void acceptData(int fd, boost::any& parameter)
102
cout<<"Have data on fd "<<fd<<endl;
103
Socket* sock=boost::any_cast<Socket*>(parameter);
106
sock->recvFrom(packet, rem);
107
cout<<"Received "<<packet.size()<<" bytes!\n";
113
Socket s(InterNetwork, Datagram);
115
IPEndpoint loc("0.0.0.0", 2000);
118
SelectFDMultiplexer sfm;
120
sfm.addReadFD(s.getHandle(), &acceptData, &s);
122
for(int n=0; n < 100 ; ++n) {
125
sfm.removeReadFD(s.getHandle());
126
sfm.removeReadFD(s.getHandle());