channel.h
Go to the documentation of this file.
// Copyright (C) 2001-2005 Federico Montesino Pouzols <fedemp@altern.org>
//
// This program 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 2 of the License, or
// (at your option) any later version.
//
// This program 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 this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
//
// This exception applies only to the code released under the name GNU
// ccRTP. If you copy code from other releases into a copy of GNU
// ccRTP, as the General Public License permits, the exception does
// not apply to the code that you add in this way. To avoid misleading
// anyone as to the status of such modified files, you must delete
// this exception notice from them.
//
// If you write modifications of your own for GNU ccRTP, it is your choice
// whether to permit this exception to apply to your modifications.
// If you do not wish that, delete this exception notice.
//
#ifndef CCRTP_CHANNEL_H_
#define CCRTP_CHANNEL_H_
#include <ccrtp/base.h>
#include <commoncpp/socket.h>
#ifndef _MSWINDOWS_
#include <sys/ioctl.h>
inline size_t ccioctl(int so, int request, size_t& len)
{ return ioctl(so,request,&len); }
#else
inline size_t ccioctl(SOCKET so, int request, size_t& len )
{
unsigned long l;
size_t result = 0;
::ioctlsocket(so,request,&l);
len = l;
return result;
}
#endif
NAMESPACE_COMMONCPP
class RTPBaseUDPIPv4Socket : private UDPSocket
{
public:
RTPBaseUDPIPv4Socket(const InetAddress& ia, tpport_t port) :
UDPSocket(ia,port)
{ }
inline ~RTPBaseUDPIPv4Socket()
{ endSocket(); }
inline bool
isPendingRecv(microtimeout_t timeout)
{ return UDPSocket::isPending(UDPSocket::pendingInput, timeout); }
inline InetHostAddress
getSender(tpport_t& port) const
{ return UDPSocket::getSender(&port); }
inline size_t
recv(unsigned char* buffer, size_t len)
{ return UDPSocket::receive(buffer, len); }
inline size_t
getNextPacketSize() const
{ size_t len; ccioctl(UDPSocket::so,FIONREAD,len); return len; }
Socket::Error
setMulticast(bool enable)
{ return UDPSocket::setMulticast(enable); }
inline Socket::Error
join(const InetMcastAddress& ia, uint32 iface)
{ return UDPSocket::join(ia,iface); }
inline Socket::Error
drop(const InetMcastAddress& ia)
{ return UDPSocket::drop(ia); }
inline Socket::Error
setTimeToLive(unsigned char ttl)
{ return UDPSocket::setTimeToLive(ttl); }
RTPBaseUDPIPv4Socket() :
UDPSocket()
{ }
inline void
setPeer(const InetAddress &ia, tpport_t port)
{UDPSocket::setPeer((InetHostAddress&)ia, port);}
inline size_t
send(const unsigned char* const buffer, size_t len)
{ return UDPSocket::send(buffer, len); }
inline SOCKET getRecvSocket() const
{ return UDPSocket::so; }
// common
inline void
endSocket()
{ UDPSocket::endSocket(); }
};
template<class BaseSocket>
class DualRTPChannel
{
public:
DualRTPChannel(const InetAddress& ia, tpport_t port)
{
recvSocket = new BaseSocket(ia,port);
sendSocket = new BaseSocket;
}
inline ~DualRTPChannel()
{ delete sendSocket; delete recvSocket; }
inline bool
isPendingRecv(microtimeout_t timeout) const
{ return recvSocket->isPendingRecv(timeout); }
inline InetHostAddress
getSender(tpport_t& port) const
{ return recvSocket->getSender(port); }
inline size_t
recv(unsigned char* buffer, size_t len)
{ return recvSocket->recv(buffer, len); }
inline size_t
getNextPacketSize() const
{ return recvSocket->getNextPacketSize(); }
inline Socket::Error
setMulticast(bool enable)
{ Socket::Error error = recvSocket->setMulticast(enable);
if (error) return error;
return sendSocket->setMulticast(enable); }
inline Socket::Error
join(const InetMcastAddress& ia, uint32 iface)
{ return recvSocket->join(ia,iface); }
inline Socket::Error
drop(const InetMcastAddress& ia)
{ return recvSocket->drop(ia); }
inline Socket::Error
setTimeToLive(unsigned char ttl)
{ return sendSocket->setTimeToLive(ttl); }
inline void
setPeer(const InetAddress& host, tpport_t port)
{ sendSocket->setPeer(host,port); }
inline size_t
send(const unsigned char* const buffer, size_t len)
{ return sendSocket->send(buffer, len); }
inline SOCKET getRecvSocket() const
{ return recvSocket->getRecvSocket(); }
// common.
inline void
endSocket()
{ sendSocket->endSocket(); recvSocket->endSocket(); }
private:
BaseSocket* sendSocket;
BaseSocket* recvSocket;
};
#ifdef CCXX_IPV6
class RTPBaseUDPIPv6Socket : private UDPSocket
{
public:
RTPBaseUDPIPv6Socket(const IPV6Address& ia, tpport_t port) :
UDPSocket(ia,port)
{ }
inline ~RTPBaseUDPIPv6Socket()
{ endSocket(); }
inline bool
isPendingRecv(microtimeout_t timeout)
{ return UDPSocket::isPending(UDPSocket::pendingInput, timeout); }
inline IPV6Host
getSender(tpport_t& port) const
{ return UDPSocket::getIPV6Sender(&port); }
inline size_t
recv(unsigned char* buffer, size_t len)
{ return UDPSocket::receive(buffer, len); }
inline size_t
getNextPacketSize() const
{ size_t len; ccioctl(UDPSocket::so,FIONREAD,len); return len; }
Socket::Error
setMulticast(bool enable)
{ return UDPSocket::setMulticast(enable); }
inline Socket::Error
join(const IPV6Multicast& ia, uint32 iface)
{ return Socket::join(ia); }
inline Socket::Error
drop(const IPV6Multicast& ia)
{ return UDPSocket::drop(ia); }
inline Socket::Error
setTimeToLive(unsigned char ttl)
{ return UDPSocket::setTimeToLive(ttl); }
RTPBaseUDPIPv6Socket() :
UDPSocket()
{ }
inline void
setPeer(const IPV6Host &ia, tpport_t port)
{UDPSocket::setPeer(ia, port);}
inline size_t
send(const unsigned char* const buffer, size_t len)
{ return UDPSocket::send(buffer, len); }
inline SOCKET getRecvSocket() const
{ return UDPSocket::so; }
// common
inline void
endSocket()
{ UDPSocket::endSocket(); }
};
template<class BaseSocket>
class DualRTPChannelIPV6
{
public:
DualRTPChannelIPV6(const IPV6Host& ia, tpport_t port)
{
recvSocket = new BaseSocket(ia,port);
sendSocket = new BaseSocket;
}
inline ~DualRTPChannelIPV6()
{ delete sendSocket; delete recvSocket; }
inline bool
isPendingRecv(microtimeout_t timeout) const
{ return recvSocket->isPendingRecv(timeout); }
inline IPV6Host
getSender(tpport_t& port) const
{ return recvSocket->getIPV6Sender(port); }
inline size_t
recv(unsigned char* buffer, size_t len)
{ return recvSocket->recv(buffer, len); }
inline size_t
getNextPacketSize() const
{ return recvSocket->getNextPacketSize(); }
inline Socket::Error
setMulticast(bool enable)
{ Socket::Error error = recvSocket->setMulticast(enable);
if (error) return error;
return sendSocket->setMulticast(enable); }
inline Socket::Error
join(const IPV6Multicast& ia, uint32 iface)
{ return recvSocket->join(ia,iface); }
inline Socket::Error
drop(const IPV6Multicast& ia)
{ return recvSocket->drop(ia); }
inline Socket::Error
setTimeToLive(unsigned char ttl)
{ return sendSocket->setTimeToLive(ttl); }
inline void
setPeer(const IPV6Host& host, tpport_t port)
{ sendSocket->setPeer(host,port); }
inline size_t
send(const unsigned char* const buffer, size_t len)
{ return sendSocket->send(buffer, len); }
inline SOCKET getRecvSocket() const
{ return recvSocket->getRecvSocket(); }
// common.
inline void
endSocket()
{ sendSocket->endSocket(); recvSocket->endSocket(); }
private:
BaseSocket* sendSocket;
BaseSocket* recvSocket;
};
typedef DualRTPChannelIPV6<RTPBaseUDPIPv6Socket> DualRTPUDPIPv6Channel;
typedef RTPBaseUDPIPv6Socket SingleRTPChannelIPV6;
typedef SingleRTPChannelIPV6 SymmetricRTPChannelIPV6;
#endif
typedef DualRTPChannel<RTPBaseUDPIPv4Socket> DualRTPUDPIPv4Channel;
typedef RTPBaseUDPIPv4Socket SingleRTPChannel;
typedef SingleRTPChannel SymmetricRTPChannel;
// sockets
END_NAMESPACE
#endif //CCRTP_CHANNEL_H_
ccioctl
size_t ccioctl(int so, int request, size_t &len)
Definition: channel.h:46
DualRTPChannel::setTimeToLive
Socket::Error setTimeToLive(unsigned char ttl)
Definition: channel.h:231
RTPBaseUDPIPv4Socket::endSocket
void endSocket()
Definition: channel.h:163
SingleRTPChannel
RTPBaseUDPIPv4Socket SingleRTPChannel
May be used in applications where using the same socket for both sending and receiving is not a limit...
Definition: channel.h:451
RTPBaseUDPIPv4Socket::send
size_t send(const unsigned char *const buffer, size_t len)
Definition: channel.h:155
RTPBaseUDPIPv4Socket::~RTPBaseUDPIPv4Socket
~RTPBaseUDPIPv4Socket()
Definition: channel.h:105
RTPBaseUDPIPv4Socket::drop
Socket::Error drop(const InetMcastAddress &ia)
Definition: channel.h:136
RTPBaseUDPIPv4Socket::recv
size_t recv(unsigned char *buffer, size_t len)
Definition: channel.h:117
DualRTPChannel::recv
size_t recv(unsigned char *buffer, size_t len)
Definition: channel.h:209
microtimeout_t
uint32 microtimeout_t
Time interval expressed in microseconds.
Definition: base.h:68
RTPBaseUDPIPv4Socket::getSender
InetHostAddress getSender(tpport_t &port) const
Definition: channel.h:113
base.h
Base elements for RTP stacks: constants, types and global functions.
RTPBaseUDPIPv4Socket
A UDP/IPv4 socket class targeted at RTP stacks.
Definition: channel.h:95
DualRTPChannel::getNextPacketSize
size_t getNextPacketSize() const
Definition: channel.h:213
RTPBaseUDPIPv4Socket::RTPBaseUDPIPv4Socket
RTPBaseUDPIPv4Socket(const InetAddress &ia, tpport_t port)
Constructor for receiver.
Definition: channel.h:101
RTPBaseUDPIPv4Socket::setPeer
void setPeer(const InetAddress &ia, tpport_t port)
Definition: channel.h:151
DualRTPChannel::getSender
InetHostAddress getSender(tpport_t &port) const
Definition: channel.h:205
RTPBaseUDPIPv4Socket::RTPBaseUDPIPv4Socket
RTPBaseUDPIPv4Socket()
Constructor for transmitter.
Definition: channel.h:146
DualRTPChannel::setMulticast
Socket::Error setMulticast(bool enable)
Definition: channel.h:217
DualRTPChannel::send
size_t send(const unsigned char *const buffer, size_t len)
Definition: channel.h:239
DualRTPChannel
Definition: channel.h:188
RTPBaseUDPIPv4Socket::getRecvSocket
SOCKET getRecvSocket() const
Definition: channel.h:158
RTPBaseUDPIPv4Socket::isPendingRecv
bool isPendingRecv(microtimeout_t timeout)
Definition: channel.h:109
RTPBaseUDPIPv4Socket::getNextPacketSize
size_t getNextPacketSize() const
Get size of next datagram waiting to be read.
Definition: channel.h:124
DualRTPChannel::join
Socket::Error join(const InetMcastAddress &ia, uint32 iface)
Definition: channel.h:223
DualRTPChannel::getRecvSocket
SOCKET getRecvSocket() const
Definition: channel.h:242
DualRTPChannel::endSocket
void endSocket()
Definition: channel.h:247
DualRTPUDPIPv4Channel
DualRTPChannel< RTPBaseUDPIPv4Socket > DualRTPUDPIPv4Channel
Definition: channel.h:445
RTPBaseUDPIPv4Socket::setMulticast
Socket::Error setMulticast(bool enable)
Definition: channel.h:128
RTPBaseUDPIPv4Socket::setTimeToLive
Socket::Error setTimeToLive(unsigned char ttl)
Definition: channel.h:140
DualRTPChannel::~DualRTPChannel
~DualRTPChannel()
Definition: channel.h:197
SymmetricRTPChannel
SingleRTPChannel SymmetricRTPChannel
Actually, RTP with a single channel can be called 'Symmetric RTP'.
Definition: channel.h:456
DualRTPChannel::setPeer
void setPeer(const InetAddress &host, tpport_t port)
Definition: channel.h:235
DualRTPChannel::isPendingRecv
bool isPendingRecv(microtimeout_t timeout) const
Definition: channel.h:201
DualRTPChannel::drop
Socket::Error drop(const InetMcastAddress &ia)
Definition: channel.h:227
RTPBaseUDPIPv4Socket::join
Socket::Error join(const InetMcastAddress &ia, uint32 iface)
Definition: channel.h:132
DualRTPChannel::DualRTPChannel
DualRTPChannel(const InetAddress &ia, tpport_t port)
Definition: channel.h:191