aboutsummaryrefslogtreecommitdiffstats
path: root/src/UdpSocket.h
blob: 07e9f0e588337eafaf966fb0838b62a64a651a64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*
   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Her Majesty the
   Queen in Right of Canada (Communications Research Center Canada)

   Copyright (C) 2015 Matthias P. Braendli
    http://www.opendigitalradio.org
   */
/*
   This file is part of ODR-DabMux.

   ODR-DabMux is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as
   published by the Free Software Foundation, either version 3 of the
   License, or (at your option) any later version.

   ODR-DabMux is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with ODR-DabMux.  If not, see <http://www.gnu.org/licenses/>.
   */

#ifndef _UDPSOCKET
#define _UDPSOCKET

#ifdef HAVE_CONFIG_H
#   include "config.h"
#endif

#include "InetAddress.h"
#ifdef _WIN32
# include <winsock.h>
# define socklen_t        int
# define reuseopt_t       char
#else
# include <sys/socket.h>
# include <netinet/in.h>
# include <unistd.h>
# include <netdb.h>
# include <arpa/inet.h>
# include <pthread.h>
# define SOCKET           int
# define INVALID_SOCKET   -1
# define SOCKET_ERROR     -1
# define reuseopt_t       int
#endif
//#define INVALID_PORT      -1

#include <stdlib.h>
#include <iostream>
#include <vector>

class UdpPacket;


/**
 *  This class represents a socket for sending and receiving UDP packets.
 *
 *  A UDP socket is the sending or receiving point for a packet delivery service.
 *  Each packet sent or received on a datagram socket is individually
 *  addressed and routed. Multiple packets sent from one machine to another may
 *  be routed differently, and may arrive in any order.
 *  @author Pascal Charest pascal.charest@crc.ca
 */
class UdpSocket {
 public:
  UdpSocket();
  UdpSocket(int port, char *name = NULL);
  ~UdpSocket();
  UdpSocket(const UdpSocket& other) = delete;
  const UdpSocket& operator=(const UdpSocket& other) = delete;

  static int init();
  static int clean();

  int create(int port = 0, char *name = NULL);

  int send(UdpPacket &packet);
  int send(const std::vector<uint8_t> data);
  int send(std::vector<uint8_t> data, InetAddress destination);
  int receive(UdpPacket &packet);
  int joinGroup(char* groupname);
  int setMulticastSource(const char* source_addr);
  int setMulticastTTL(int ttl);
  /**
   *  Connects the socket on a specific address. Only data from this address
   *  will be received.
   *  @param addr The address to connect the socket
   *  @warning Not implemented yet.
   */
  void connect(InetAddress &addr);
  int setBlocking(bool block);

 protected:
  /// The address on which the socket is binded.
  InetAddress address;
  /// The low-level socket used by system functions.
  SOCKET listenSocket;
};

/**
 *  This class represents a UDP packet. 
 *
 *  UDP packets are used to implement a connectionless packet delivery service.
 *  Each message is routed from one machine to another based solely on
 *  information contained within that packet. Multiple packets sent from one
 *  machine to another might be routed differently, and might arrive in any order. 
 *  @author Pascal Charest pascal.charest@crc.ca
 */
class UdpPacket {
 public:
  UdpPacket(unsigned int initSize = 1024);
  UdpPacket(const UdpPacket& packet) = delete;
  const UdpPacket& operator=(const UdpPacket&) = delete;
  UdpPacket(const UdpPacket&& packet) = delete;
  const UdpPacket& operator=(const UdpPacket&&) = delete;
  ~UdpPacket();

  char *getData();
  void addData(const void *data, unsigned size);
  unsigned long getLength();
  unsigned long getSize();
  unsigned long getOffset();
  void setLength(unsigned long len);
  void setOffset(unsigned long val);
  void setSize(unsigned newSize);
  InetAddress &getAddress();
  
 private:
  char *dataBuf;
  unsigned long length, size, offset;
  InetAddress address;
};

#endif // _UDPSOCKET