nidas v1.2.3
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
34namespace nidas { namespace util {
35
40public:
41
52
63 DatagramPacketBase(int l, const Inet4Address& add, int port):
64 maxlength(l),length(l),
65 addr(new Inet4SocketAddress(add,port)) {}
66
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
148protected:
153
159
165
166};
167
177template <class DataT>
179public:
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
248protected:
249 DataT* data;
250
251private:
252};
253
255{
256public:
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 const void * getConstDataVoidPtr() const =0
DatagramPacketBase(const DatagramPacketBase &x)
Copy constructor.
Definition DatagramPacket.h:73
SocketAddress * addr
The destination address for a send, or the remote senders address after a receive.
Definition DatagramPacket.h:164
virtual void setLength(int val)
Set the value for the current number of bytes in data.
Definition DatagramPacket.h:128
const struct sockaddr * getConstSockAddrPtr() const
Definition DatagramPacket.h:111
DatagramPacketBase(int l, const SocketAddress &add)
Definition DatagramPacket.h:67
void setMaxLength(int val)
Set the allocated length in bytes of the data.
Definition DatagramPacket.h:141
SocketAddress & getSocketAddress() const
Definition DatagramPacket.h:100
void setSocketAddress(const SocketAddress &val)
Definition DatagramPacket.h:102
int length
length of datagram that was read or will be sent.
Definition DatagramPacket.h:158
int getSockAddrLen() const
Definition DatagramPacket.h:115
virtual ~DatagramPacketBase()
Virtual destructor.
Definition DatagramPacket.h:95
DatagramPacketBase & operator=(const DatagramPacketBase &rhs)
Assignment operator.
Definition DatagramPacket.h:81
virtual int getLength() const
Get the value for the current number of bytes in data.
Definition DatagramPacket.h:135
int maxlength
allocated length in bytes of contents.
Definition DatagramPacket.h:152
virtual void * getDataVoidPtr()=0
Get the pointer to the data portion of the packet.
DatagramPacketBase(int l, const Inet4Address &add, int port)
Create a DatagramPacketBase for sending.
Definition DatagramPacket.h:63
int getMaxLength() const
Return the allocated length in bytes of the data.
Definition DatagramPacket.h:146
struct sockaddr * getSockAddrPtr()
Definition DatagramPacket.h:109
DatagramPacketBase(int l)
Create a DatagramPacketBase for receiving.
Definition DatagramPacket.h:50
A DatagramPacket with a specific structure of data.
Definition DatagramPacket.h:178
DatagramPacketT & operator=(const DatagramPacketT &rhs)
Assignment operator.
Definition DatagramPacket.h:221
DatagramPacketT(DataT *buf, int n, const SocketAddress &add)
Definition DatagramPacket.h:202
DataT * getData()
Definition DatagramPacket.h:237
void setData(DataT *val)
Set the pointer to the data portion of the packet.
Definition DatagramPacket.h:246
DatagramPacketT(DataT *buf, int n)
Create a datagram packet from a pointer to some data.
Definition DatagramPacket.h:186
virtual void * getDataVoidPtr()
Get the pointer to the data portion of the packet.
Definition DatagramPacket.h:233
DataT * data
Definition DatagramPacket.h:249
DatagramPacketT(DataT *buf, int n, const Inet4Address &add, int port)
Create a DatagramPacket for sending.
Definition DatagramPacket.h:199
DatagramPacketT(const DatagramPacketT &x)
Copy constructor.
Definition DatagramPacket.h:210
virtual const void * getConstDataVoidPtr() const
Definition DatagramPacket.h:235
Definition DatagramPacket.h:255
DatagramPacket(char *buf, int length)
Definition DatagramPacket.h:257
DatagramPacket(char *buf, int length, const SocketAddress &add)
Definition DatagramPacket.h:273
DatagramPacket(char *buf, int length, const Inet4Address &add, int port)
Create a DatagramPacket for sending.
Definition DatagramPacket.h:270
Support for IP version 4 host address.
Definition Inet4Address.h:46
A IP version 4 socket address, containing a host address, and a port number.
Definition Inet4SocketAddress.h:41
An interface for a socket address.
Definition SocketAddress.h:36
virtual SocketAddress * clone() const =0
Virtual constructor.
virtual struct sockaddr * getSockAddrPtr()=0
Provide non-const pointer to struct sockaddr_in.
virtual socklen_t getSockAddrLen() const =0
Return the length of the struct sockaddr_XX for this address family.
virtual const struct sockaddr * getConstSockAddrPtr() const =0
Root namespace for the NCAR In-Situ Data Acquisition Software.
Definition A2DConverter.h:31
static n_u::SerialPort port
Definition sing.cc:68