00001 #include <iostream>
00002 #include <string>
00003 #include <algorithm>
00004 #include <cstdlib>
00005 #include <socklibpp/socklistener.h>
00006
00007 using namespace std;
00008 using namespace socklibpp;
00009
00010 listener<> server;
00011 int global_counter = 1;
00012
00013 #define USE_FOREACH
00014
00015 bool do_stuffs(sock sb, int i)
00016 {
00017 if (i == 0) {
00018 addr_in a;
00019 sock newconn = sb.accept(a);
00020 if (!sb.error) {
00021 cout << "Received connection " << global_counter <<
00022 '(' << newconn.fd << ')' << " from " << a << endl;
00023 server.add(newconn, global_counter++);
00024 }
00025 } else {
00026 char buffer[256];
00027 int r = sb.recv(buffer, sizeof buffer);
00028 if (r<1) {
00029 cout << "Lost connection " << i << '(' << sb.fd << ')' << endl;
00030 sb.close();
00031 #ifndef USE_FOREACH
00032
00033 server.remove(sb);
00034 #endif
00035 return true;
00036 }
00037
00038 cout << "Receiving data from connection " << i << '(' << sb.fd << ')' << ":\n" <<
00039 string(buffer, r) << endl;
00040 }
00041 return false;
00042 }
00043
00044 void do_stuffs_helper(const pair<sock,int>& data)
00045 {
00046 do_stuffs(data.first, data.second);
00047 }
00048
00049
00050 int main(int argc, char **argv)
00051 {
00052 uint16_t port = 3747;
00053
00054 if (argc>1)
00055 port = strtoul(argv[1], NULL, 10);
00056
00057 addr_in local(addr_in::addr_any, port);
00058 sock passive(sock::pf_inet, sock::sock_stream);
00059 if (!passive.bind(local) || !passive.listen())
00060 return 1;
00061
00062 server.add(passive);
00063
00064 #ifndef USE_FOREACH
00065 list< pair<sock, int> > to_read;
00066 #endif
00067
00068 cout << "We are going to test the server using "
00069 #ifdef USE_FOREACH
00070 "server::for_each_read"
00071 #else
00072 "server::readable"
00073 #endif
00074 " on port " << port << endl;
00075
00076 do {
00077 cout << "Listening to " << server.size() << " sockets.\n"
00078 "Press enter to test for readability (Ctrl+C to exit)" << endl;
00079 cin.ignore();
00080
00081 #ifndef USE_FOREACH
00082 to_read.clear();
00083 server.readable(to_read);
00084 for_each(to_read.begin(), to_read.end(), do_stuffs_helper);
00085 #else
00086 server.for_each_read(do_stuffs);
00087 #endif
00088
00089 } while (cin.good());
00090 }