00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 #include <iostream>
00009 
00010 #include <messages.h>
00011 #include <listener.h>
00012 #include <socket.h>
00013 
00014 
00015 #include <boost/asio.hpp>
00016 #include <boost/thread.hpp>
00017 
00018 using namespace FastEcslent;
00019 using namespace boost::asio::ip;
00020 
00021 void Listener::init() { 
00022         std::cout << "Initializing Listener before starting listener thread. port: " << port << std::endl;
00023         quit = false;
00024 
00025 
00026 
00027 
00028 
00029 
00030 }
00031 
00032 void Listener::init(std::string ip) {
00033         IPAddress = ip;
00034         init();
00035 }
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 void Listener::addMessage(Message *m) {
00044         
00045         
00046         recBuffer.push_back(m);
00047 }
00048 
00049 Message *Listener::dequeMessage(){
00050 
00051         if (recBuffer.empty()) {
00052                 return NULL;
00053         } else {
00054                 Message *m = recBuffer.front();
00055                 recBuffer.pop_front();
00056                 return m;
00057         }
00058 }
00059 
00060 void FastEcslent::Listener::run() { 
00061         listenerThread = boost::thread(&FastEcslent::Listener::runThread, this);
00062         std::cout << "Running Listener thread: " << listenerThread.get_id() << std::endl;
00063 }
00064 
00065 
00066 void FastEcslent::Listener::runThread(){ 
00067         std::cout << "..........................................Running listener......................................" << std::endl;
00068         try {
00069 
00070                 socket = makeUDPBroadcastSocket();
00071                 
00072                 
00073 
00074                 
00075                 
00076                 
00077                 
00078                 
00079                 socket->bind(udp::endpoint(boost::asio::ip::address_v4::broadcast( ), port));
00080                 std::cout << "Listener Bound Socket" << std::endl;
00081 
00082                 udp::endpoint recFrom;
00083                 while(!quit){
00084                         
00085                         size_t len;
00086                         Message *m = new Message;
00087                         len = socket->receive_from(boost::asio::buffer((char *) m, MaxMessageSize), recFrom);
00088                         if (recFrom.address().to_string() != IPAddress ) {
00089 
00090 
00091                                 
00092                                 addMessage((Message *) m);
00093                         }else{
00094                                 delete m;
00095                         }
00096                 }
00097                 } catch (std::exception& e) {
00098                         std::cerr << "Listener Exception: " << e.what() << std::endl;
00099                         
00100                         return;
00101                 }
00102 
00103                 std::cout << "..........................................Listener Dead......................................" << std::endl;
00104 }
00105 
00106 void FastEcslent::Listener::stop(){ 
00107         std::cout << "Listener stopping..." << std::endl;
00108         boost::mutex::scoped_lock scoped_lock(quitLock);
00109         quit = true;
00110 }
00111 
00112 void FastEcslent::Listener::kill(){ 
00113         std::cout << "Listener killed..." << std::endl;
00114         quit = true;
00115         listenerThread.interrupt();
00116 }
00117 
00118 void FastEcslent::Listener::join(){ 
00119         std::cout << "Listener shutting down socket..." << quit << std::endl;
00120         std::flush(std::cout);
00121         listenerThread.join();
00122         try {
00123                         boost::system::error_code ec;                   
00124                         
00125                         if(socket->is_open())
00126                                 socket->close(ec);
00127                         
00128                         if (ec){
00129                                 std::cerr << "Error in closing listener socket:" << ec.message() << std::endl;
00130                         }
00131                 } catch (std::exception& e) {
00132                         std::cerr << "Exception: in closing listener socket:" << e.what() << std::endl;
00133                 }
00134         std::cout << "Listener Socket shutdown." << std::endl;
00135 }
00136 
00137