Network/UDPForward: Add udpforward util
[udpforward.git] / UDPForwarder.cc
1 // $Id$
2 //
3 // Copyright (C) 2008 
4
5 /** \file
6     \brief UDPForwarder non-inline non-template implementation */
7
8 #include "UDPForwarder.hh"
9 //#include "UDPForwarder.ih"
10
11 // Custom includes
12
13 //#include "UDPForwarder.mpp"
14 #define prefix_
15 ///////////////////////////////cc.p////////////////////////////////////////
16
17 prefix_ udpforward::UDPForwarder::UDPForwarder(senf::INet4SocketAddress const & addr,
18                                                senf::INet4SocketAddress const & target)
19     :  socket_ (addr), target_(target), peer_ (), 
20        event_ ("UDPForwarder::read", senf::membind(&UDPForwarder::readEvent, this),
21                socket_, senf::scheduler::FdEvent::EV_READ)
22 {
23     SENF_LOG(("Input socket opened at " << addr << ". Forwarding to " << target));
24 }
25
26 prefix_ void udpforward::UDPForwarder::readEvent(int event)
27 {
28     if (event != senf::scheduler::FdEvent::EV_READ) 
29         throw ForwarderException("Unexpected remote socket read failure");
30
31     std::string packet;
32     senf::INet4SocketAddress addr;
33     socket_.readfrom(packet, addr, 0);
34
35     if (addr == target_) {
36         if (! peer_)
37             SENF_LOG((senf::log::MESSAGE)("Return packet dropped (no peer)"));
38         else {
39             SENF_LOG((senf::log::VERBOSE)("Return packet to " << peer_));
40             socket_.writeto(peer_, packet);
41         }
42         return;
43     }
44     
45     if (addr != peer_) {
46         SENF_LOG((senf::log::NOTICE)("Peer address changed from " << peer_ << " to " << addr));
47         peer_ = addr;
48     }
49     socket_.writeto(target_, packet);
50     SENF_LOG((senf::log::VERBOSE)("Forward packet from " << peer_));
51 }
52
53 ///////////////////////////////cc.e////////////////////////////////////////
54 #undef prefix_
55 //#include "UDPForwarder.mpp"
56
57 \f
58 // Local Variables:
59 // mode: c++
60 // fill-column: 100
61 // indent-tabs-mode: nil
62 // compile-command: "scons"
63 // comment-column: 40
64 // End: