proxygen
folly::AsyncUDPServerSocket Class Reference

#include <AsyncUDPServerSocket.h>

Inheritance diagram for folly::AsyncUDPServerSocket:
folly::AsyncUDPSocket::ReadCallback folly::AsyncSocketBase

Classes

class  Callback
 

Public Member Functions

 AsyncUDPServerSocket (EventBase *evb, size_t sz=1500)
 
 ~AsyncUDPServerSocket () override
 
void bind (const folly::SocketAddress &addy)
 
void setReusePort (bool reusePort)
 
folly::SocketAddress address () const
 
void getAddress (SocketAddress *a) const override
 
void addListener (EventBase *evb, Callback *callback)
 
void listen ()
 
int getFD () const
 
void close ()
 
EventBasegetEventBase () const override
 
void pauseAccepting ()
 
void resumeAccepting ()
 
- Public Member Functions inherited from folly::AsyncSocketBase
virtual ~AsyncSocketBase ()=default
 

Private Types

typedef std::pair< EventBase *, Callback * > Listener
 

Private Member Functions

void getReadBuffer (void **buf, size_t *len) noexceptoverride
 
void onDataAvailable (const folly::SocketAddress &clientAddress, size_t len, bool truncated) noexceptoverride
 
void onReadError (const AsyncSocketException &ex) noexceptoverride
 
void onReadClosed () noexceptoverride
 
- Private Member Functions inherited from folly::AsyncUDPSocket::ReadCallback
virtual ~ReadCallback ()=default
 

Private Attributes

EventBase *const evb_
 
const size_t packetSize_
 
std::shared_ptr< AsyncUDPSocketsocket_
 
std::vector< Listenerlisteners_
 
uint32_t nextListener_
 
folly::IOBufQueue buf_
 
bool reusePort_ {false}
 

Detailed Description

UDP server socket

It wraps a UDP socket waiting for packets and distributes them among a set of event loops in round robin fashion.

NOTE: At the moment it is designed to work with single packet protocols in mind. We distribute incoming packets among all the listeners in round-robin fashion. So, any protocol that expects to send/recv more than 1 packet will not work because they will end up with different event base to process.

Definition at line 38 of file AsyncUDPServerSocket.h.

Member Typedef Documentation

Definition at line 240 of file AsyncUDPServerSocket.h.

Constructor & Destructor Documentation

folly::AsyncUDPServerSocket::AsyncUDPServerSocket ( EventBase evb,
size_t  sz = 1500 
)
inlineexplicit

Create a new UDP server socket

Note about packet size - We allocate buffer of packetSize_ size to read. If packet are larger than this value, as per UDP protocol, remaining data is dropped and you get truncated = true in onDataAvailable callback

Definition at line 86 of file AsyncUDPServerSocket.h.

folly::AsyncUDPServerSocket::~AsyncUDPServerSocket ( )
inlineoverride

Definition at line 89 of file AsyncUDPServerSocket.h.

References close(), and socket_.

89  {
90  if (socket_) {
91  close();
92  }
93  }
std::shared_ptr< AsyncUDPSocket > socket_

Member Function Documentation

void folly::AsyncUDPServerSocket::addListener ( EventBase evb,
Callback callback 
)
inline

Add a listener to the round robin list

Definition at line 119 of file AsyncUDPServerSocket.h.

References listeners_.

119  {
120  listeners_.emplace_back(evb, callback);
121  }
std::vector< Listener > listeners_
folly::SocketAddress folly::AsyncUDPServerSocket::address ( ) const
inline

Definition at line 107 of file AsyncUDPServerSocket.h.

References socket_.

Referenced by getAddress().

107  {
108  CHECK(socket_);
109  return socket_->address();
110  }
std::shared_ptr< AsyncUDPSocket > socket_
void folly::AsyncUDPServerSocket::bind ( const folly::SocketAddress addy)
inline

Definition at line 95 of file AsyncUDPServerSocket.h.

References evb_, reusePort_, and socket_.

95  {
96  CHECK(!socket_);
97 
98  socket_ = std::make_shared<AsyncUDPSocket>(evb_);
99  socket_->setReusePort(reusePort_);
100  socket_->bind(addy);
101  }
std::shared_ptr< AsyncUDPSocket > socket_
void folly::AsyncUDPServerSocket::close ( )
inline

Definition at line 141 of file AsyncUDPServerSocket.h.

References socket_.

Referenced by ~AsyncUDPServerSocket().

141  {
142  CHECK(socket_) << "Need to bind before closing";
143  socket_->close();
144  socket_.reset();
145  }
std::shared_ptr< AsyncUDPSocket > socket_
void folly::AsyncUDPServerSocket::getAddress ( SocketAddress a) const
inlineoverridevirtual

Implements folly::AsyncSocketBase.

Definition at line 112 of file AsyncUDPServerSocket.h.

References address().

112  {
113  *a = address();
114  }
folly::SocketAddress address() const
char a
EventBase* folly::AsyncUDPServerSocket::getEventBase ( ) const
inlineoverridevirtual

Implements folly::AsyncSocketBase.

Definition at line 147 of file AsyncUDPServerSocket.h.

References evb_.

Referenced by wangle::AsyncUDPServerSocketFactory::ThreadSafeDestructor::operator()().

147  {
148  return evb_;
149  }
int folly::AsyncUDPServerSocket::getFD ( ) const
inline

Definition at line 136 of file AsyncUDPServerSocket.h.

References socket_.

136  {
137  CHECK(socket_) << "Need to bind before getting FD";
138  return socket_->getFD();
139  }
std::shared_ptr< AsyncUDPSocket > socket_
void folly::AsyncUDPServerSocket::getReadBuffer ( void **  buf,
size_t *  len 
)
inlineoverrideprivatevirtualnoexcept

Invoked when the socket becomes readable and we want buffer to write to.

NOTE: From socket we will end up reading at most len bytes and if there were more bytes in datagram, we will end up dropping them.

Implements folly::AsyncUDPSocket::ReadCallback.

Definition at line 179 of file AsyncUDPServerSocket.h.

References buf_, packetSize_, and folly::IOBufQueue::preallocate().

179  {
180  std::tie(*buf, *len) = buf_.preallocate(packetSize_, packetSize_);
181  }
std::pair< void *, std::size_t > preallocate(std::size_t min, std::size_t newAllocationSize, std::size_t max=std::numeric_limits< std::size_t >::max())
Definition: IOBufQueue.h:356
void folly::AsyncUDPServerSocket::listen ( )
inline

Definition at line 123 of file AsyncUDPServerSocket.h.

References listeners_, and socket_.

123  {
124  CHECK(socket_) << "Need to bind before listening";
125 
126  for (auto& listener : listeners_) {
127  auto callback = listener.second;
128 
129  listener.first->runInEventBaseThread(
130  [callback]() mutable { callback->onListenStarted(); });
131  }
132 
133  socket_->resumeRead(this);
134  }
std::shared_ptr< AsyncUDPSocket > socket_
std::vector< Listener > listeners_
void folly::AsyncUDPServerSocket::onDataAvailable ( const folly::SocketAddress client,
size_t  len,
bool  truncated 
)
inlineoverrideprivatevirtualnoexcept

Invoked when a new datagraom is available on the socket. len is the number of bytes read and truncated is true if we had to drop few bytes because of running out of buffer space.

Implements folly::AsyncUDPSocket::ReadCallback.

Definition at line 183 of file AsyncUDPServerSocket.h.

References buf_, folly::data(), f, listeners_, folly::gen::move, nextListener_, folly::IOBufQueue::postallocate(), folly::netops::socket(), socket_, folly::IOBufQueue::split(), and folly::WARNING.

186  {
187  buf_.postallocate(len);
188  auto data = buf_.split(len);
189 
190  if (listeners_.empty()) {
191  LOG(WARNING) << "UDP server socket dropping packet, "
192  << "no listener registered";
193  return;
194  }
195 
196  if (nextListener_ >= listeners_.size()) {
197  nextListener_ = 0;
198  }
199 
200  auto client = clientAddress;
201  auto callback = listeners_[nextListener_].second;
202  auto socket = socket_;
203 
204  // Schedule it in the listener's eventbase
205  // XXX: Speed this up
206  auto f = [socket,
207  client,
208  callback,
209  data = std::move(data),
210  truncated]() mutable {
211  callback->onDataAvailable(socket, client, std::move(data), truncated);
212  };
213 
214  listeners_[nextListener_].first->runInEventBaseThread(std::move(f));
215  ++nextListener_;
216  }
std::unique_ptr< folly::IOBuf > split(size_t n)
Definition: IOBufQueue.h:420
auto f
std::shared_ptr< AsyncUDPSocket > socket_
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
constexpr auto data(C &c) -> decltype(c.data())
Definition: Access.h:71
NetworkSocket socket(int af, int type, int protocol)
Definition: NetOps.cpp:412
std::vector< Listener > listeners_
void postallocate(std::size_t n)
Definition: IOBufQueue.h:380
void folly::AsyncUDPServerSocket::onReadClosed ( )
inlineoverrideprivatevirtualnoexcept

Invoked when socket is closed and a read callback is registered.

Implements folly::AsyncUDPSocket::ReadCallback.

Definition at line 225 of file AsyncUDPServerSocket.h.

References listeners_.

225  {
226  for (auto& listener : listeners_) {
227  auto callback = listener.second;
228 
229  listener.first->runInEventBaseThread(
230  [callback]() mutable { callback->onListenStopped(); });
231  }
232  }
std::vector< Listener > listeners_
void folly::AsyncUDPServerSocket::onReadError ( const AsyncSocketException ex)
inlineoverrideprivatevirtualnoexcept

Invoked when there is an error reading from the socket.

NOTE: Since UDP is connectionless, you can still read from the socket. But you have to re-register readCallback yourself after onReadError.

Implements folly::AsyncUDPSocket::ReadCallback.

Definition at line 218 of file AsyncUDPServerSocket.h.

References socket_.

218  {
219  LOG(ERROR) << ex.what();
220 
221  // Lets register to continue listening for packets
222  socket_->resumeRead(this);
223  }
std::shared_ptr< AsyncUDPSocket > socket_
void folly::AsyncUDPServerSocket::pauseAccepting ( )
inline

Pauses accepting datagrams on the underlying socket.

Definition at line 154 of file AsyncUDPServerSocket.h.

References listeners_, and socket_.

154  {
155  socket_->pauseRead();
156  for (auto& listener : listeners_) {
157  auto callback = listener.second;
158 
159  listener.first->runInEventBaseThread(
160  [callback]() mutable { callback->onListenPaused(); });
161  }
162  }
std::shared_ptr< AsyncUDPSocket > socket_
std::vector< Listener > listeners_
void folly::AsyncUDPServerSocket::resumeAccepting ( )
inline

Starts accepting datagrams once again.

Definition at line 167 of file AsyncUDPServerSocket.h.

References listeners_, and socket_.

167  {
168  socket_->resumeRead(this);
169  for (auto& listener : listeners_) {
170  auto callback = listener.second;
171 
172  listener.first->runInEventBaseThread(
173  [callback]() mutable { callback->onListenResumed(); });
174  }
175  }
std::shared_ptr< AsyncUDPSocket > socket_
std::vector< Listener > listeners_
void folly::AsyncUDPServerSocket::setReusePort ( bool  reusePort)
inline

Definition at line 103 of file AsyncUDPServerSocket.h.

References reusePort_.

103  {
104  reusePort_ = reusePort;
105  }

Member Data Documentation

folly::IOBufQueue folly::AsyncUDPServerSocket::buf_
private

Definition at line 247 of file AsyncUDPServerSocket.h.

Referenced by getReadBuffer(), and onDataAvailable().

EventBase* const folly::AsyncUDPServerSocket::evb_
private

Definition at line 234 of file AsyncUDPServerSocket.h.

Referenced by bind(), and getEventBase().

std::vector<Listener> folly::AsyncUDPServerSocket::listeners_
private
uint32_t folly::AsyncUDPServerSocket::nextListener_
private

Definition at line 244 of file AsyncUDPServerSocket.h.

Referenced by onDataAvailable().

const size_t folly::AsyncUDPServerSocket::packetSize_
private

Definition at line 235 of file AsyncUDPServerSocket.h.

Referenced by getReadBuffer().

bool folly::AsyncUDPServerSocket::reusePort_ {false}
private

Definition at line 249 of file AsyncUDPServerSocket.h.

Referenced by bind(), and setReusePort().

std::shared_ptr<AsyncUDPSocket> folly::AsyncUDPServerSocket::socket_
private

The documentation for this class was generated from the following file: