nidas  v1.2-1520
DatagramPacket.h
Go to the documentation of this file.
1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4; -*-
2 // vim: set shiftwidth=4 softtabstop=4 expandtab:
3 /*
4  ********************************************************************
5  ** NIDAS: NCAR In-situ Data Acquistion Software
6  **
7  ** 2006, Copyright University Corporation for Atmospheric Research
8  **
9  ** This program is free software; you can redistribute it and/or modify
10  ** it under the terms of the GNU General Public License as published by
11  ** the Free Software Foundation; either version 2 of the License, or
12  ** (at your option) any later version.
13  **
14  ** This program is distributed in the hope that it will be useful,
15  ** but WITHOUT ANY WARRANTY; without even the implied warranty of
16  ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  ** GNU General Public License for more details.
18  **
19  ** The LICENSE.txt file accompanying this software contains
20  ** a copy of the GNU General Public License. If it is not found,
21  ** write to the Free Software Foundation, Inc.,
22  ** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23  **
24  ********************************************************************
25 */
26 
27 #ifndef NIDAS_UTIL_DATAGRAMPACKET_H
28 #define NIDAS_UTIL_DATAGRAMPACKET_H
29 
30 #include "Inet4SocketAddress.h"
31 
32 #include <sys/param.h> // MIN
33 
34 namespace nidas { namespace util {
35 
40 public:
41 
51  maxlength(l),length(l),addr(new Inet4SocketAddress()) {}
52 
63  DatagramPacketBase(int l, const Inet4Address& add, int port):
64  maxlength(l),length(l),
65  addr(new Inet4SocketAddress(add,port)) {}
66 
67  DatagramPacketBase(int l, const SocketAddress& add):
68  maxlength(l),length(l),addr(add.clone()) {}
69 
74  maxlength(x.maxlength),length(x.length),addr(x.addr->clone())
75  {
76  }
77 
82  {
83  if (this != &rhs) {
84  maxlength = rhs.maxlength;
85  length = rhs.length;
86  delete addr;
87  addr = rhs.addr->clone();
88  }
89  return *this;
90  }
91 
96  {
97  delete addr;
98  }
99 
100  SocketAddress& getSocketAddress() const { return *addr; }
101 
103  {
104  SocketAddress* oldaddr = addr;
105  addr = val.clone();
106  delete oldaddr;
107  }
108 
109  struct sockaddr* getSockAddrPtr() { return addr->getSockAddrPtr(); }
110 
111  const struct sockaddr* getConstSockAddrPtr() const {
112  return addr->getConstSockAddrPtr();
113  }
114 
115  int getSockAddrLen() const { return addr->getSockAddrLen(); }
116 
120  virtual void* getDataVoidPtr() = 0;
121 
122  virtual const void* getConstDataVoidPtr() const = 0;
123 
128  virtual void setLength(int val) { length = val; }
129 
135  virtual int getLength() const { return length; }
136 
141  void setMaxLength(int val) { maxlength = val; }
142 
146  int getMaxLength() const { return maxlength; }
147 
148 protected:
153 
158  int length;
159 
165 
166 };
167 
177 template <class DataT>
179 public:
180 
186  DatagramPacketT(DataT* buf, int n) :
187  DatagramPacketBase(n * sizeof(DataT)),data(buf) {}
188 
199  DatagramPacketT(DataT* buf, int n, const Inet4Address& add, int port):
200  DatagramPacketBase(n * sizeof(DataT),add,port),data(buf) {}
201 
202  DatagramPacketT(DataT* buf, int n, const SocketAddress& add):
203  DatagramPacketBase(n * sizeof(DataT),add),data(buf) {}
204 
212  {
213  }
214 
222  {
223  if (this != &rhs) {
224  (*(DatagramPacketBase*)this) = rhs;
225  data = rhs.data;
226  }
227  return *this;
228  }
229 
233  virtual void* getDataVoidPtr() { return data; }
234 
235  virtual const void* getConstDataVoidPtr() const { return data; }
236 
237  DataT* getData() { return data; }
238 
246  void setData(DataT *val) { data = val; }
247 
248 protected:
249  DataT* data;
250 
251 private:
252 };
253 
254 class DatagramPacket: public DatagramPacketT<char>
255 {
256 public:
257  DatagramPacket(char* buf, int length) :
258  DatagramPacketT<char>(buf,length) {}
259 
270  DatagramPacket(char* buf, int length, const Inet4Address& add, int port):
271  DatagramPacketT<char>(buf,length,add,port) {}
272 
273  DatagramPacket(char* buf, int length, const SocketAddress& add):
274  DatagramPacketT<char>(buf,length,add) {}
275 };
276 
277 } } // namespace nidas namespace util
278 
279 #endif
Abstract base class for a UDP datagram.
Definition: DatagramPacket.h:39
virtual void * getDataVoidPtr()
Get the pointer to the data portion of the packet.
Definition: DatagramPacket.h:233
DatagramPacketBase & operator=(const DatagramPacketBase &rhs)
Assignment operator.
Definition: DatagramPacket.h:81
int maxlength
allocated length in bytes of contents.
Definition: DatagramPacket.h:152
SocketAddress * addr
The destination address for a send, or the remote senders address after a receive.
Definition: DatagramPacket.h:164
DataT * data
Definition: DatagramPacket.h:249
DatagramPacketBase(int l, const SocketAddress &add)
Definition: DatagramPacket.h:67
struct sockaddr * getConstSockAddrPtr() const
Definition: DatagramPacket.h:111
SocketAddress & getSocketAddress() const
Definition: DatagramPacket.h:100
virtual struct sockaddr * getSockAddrPtr()=0
Provide non-const pointer to struct sockaddr_in.
An interface for a socket address.
Definition: SocketAddress.h:36
int getSockAddrLen() const
Definition: DatagramPacket.h:115
int getMaxLength() const
Return the allocated length in bytes of the data.
Definition: DatagramPacket.h:146
DatagramPacketT & operator=(const DatagramPacketT &rhs)
Assignment operator.
Definition: DatagramPacket.h:221
DatagramPacketBase(int l, const Inet4Address &add, int port)
Create a DatagramPacketBase for sending.
Definition: DatagramPacket.h:63
A IP version 4 socket address, containing a host address, and a port number.
Definition: Inet4SocketAddress.h:41
virtual socklen_t getSockAddrLen() const =0
Return the length of the struct sockaddr_XX for this address family.
DatagramPacketT(const DatagramPacketT &x)
Copy constructor.
Definition: DatagramPacket.h:210
DatagramPacket(char *buf, int length, const Inet4Address &add, int port)
Create a DatagramPacket for sending.
Definition: DatagramPacket.h:270
DataT * getData()
Definition: DatagramPacket.h:237
DatagramPacketT(DataT *buf, int n, const SocketAddress &add)
Definition: DatagramPacket.h:202
void setMaxLength(int val)
Set the allocated length in bytes of the data.
Definition: DatagramPacket.h:141
DatagramPacket(char *buf, int length)
Definition: DatagramPacket.h:257
DatagramPacketT(DataT *buf, int n)
Create a datagram packet from a pointer to some data.
Definition: DatagramPacket.h:186
virtual void setLength(int val)
Set the value for the current number of bytes in data.
Definition: DatagramPacket.h:128
struct sockaddr * getSockAddrPtr()
Definition: DatagramPacket.h:109
DatagramPacketBase(int l)
Create a DatagramPacketBase for receiving.
Definition: DatagramPacket.h:50
virtual const void * getConstDataVoidPtr() const
Definition: DatagramPacket.h:235
virtual void * getDataVoidPtr()=0
Get the pointer to the data portion of the packet.
DatagramPacketT(DataT *buf, int n, const Inet4Address &add, int port)
Create a DatagramPacket for sending.
Definition: DatagramPacket.h:199
void setData(DataT *val)
Set the pointer to the data portion of the packet.
Definition: DatagramPacket.h:246
int length
length of datagram that was read or will be sent.
Definition: DatagramPacket.h:158
A DatagramPacket with a specific structure of data.
Definition: DatagramPacket.h:178
virtual int getLength() const
Get the value for the current number of bytes in data.
Definition: DatagramPacket.h:135
virtual const void * getConstDataVoidPtr() const =0
DatagramPacketBase(const DatagramPacketBase &x)
Copy constructor.
Definition: DatagramPacket.h:73
static n_u::SerialPort port
Definition: sing.cc:68
virtual ~DatagramPacketBase()
Virtual destructor.
Definition: DatagramPacket.h:95
Definition: DatagramPacket.h:254
void setSocketAddress(const SocketAddress &val)
Definition: DatagramPacket.h:102
DatagramPacket(char *buf, int length, const SocketAddress &add)
Definition: DatagramPacket.h:273
virtual struct sockaddr * getConstSockAddrPtr() const =0
virtual SocketAddress * clone() const =0
Virtual constructor.
Support for IP version 4 host address.
Definition: Inet4Address.h:46