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