37#ifndef CCRTP_CHANNEL_H_
38#define CCRTP_CHANNEL_H_
41#include <commoncpp/socket.h>
45inline size_t ccioctl(
int so,
int request,
size_t& len)
46 {
return ioctl(so,request,&len); }
48inline size_t ccioctl(SOCKET so,
int request,
size_t& len )
52 ::ioctlsocket(so,request,&l);
109 {
return UDPSocket::isPending(UDPSocket::pendingInput, timeout); }
111 inline InetHostAddress
113 {
return UDPSocket::getSender(&port); }
116 recv(
unsigned char* buffer,
size_t len)
117 {
return UDPSocket::receive(buffer, len); }
124 {
size_t len;
ccioctl(UDPSocket::so,FIONREAD,len);
return len; }
128 {
return UDPSocket::setMulticast(enable); }
131 join(
const InetMcastAddress& ia, uint32 iface)
132 {
return UDPSocket::join(ia,iface); }
135 drop(
const InetMcastAddress& ia)
136 {
return UDPSocket::drop(ia); }
140 {
return UDPSocket::setTimeToLive(ttl); }
151 {UDPSocket::setPeer((InetHostAddress&)ia, port);}
154 send(
const unsigned char*
const buffer,
size_t len)
155 {
return UDPSocket::send(buffer, len); }
158 {
return UDPSocket::so; }
163 { UDPSocket::endSocket(); }
186template<
class BaseSocket>
192 recvSocket =
new BaseSocket(ia,port);
193 sendSocket =
new BaseSocket;
197 {
delete sendSocket;
delete recvSocket; }
201 {
return recvSocket->isPendingRecv(timeout); }
203 inline InetHostAddress
205 {
return recvSocket->getSender(port); }
208 recv(
unsigned char* buffer,
size_t len)
209 {
return recvSocket->recv(buffer, len); }
213 {
return recvSocket->getNextPacketSize(); }
217 { Socket::Error error = recvSocket->setMulticast(enable);
218 if (error)
return error;
219 return sendSocket->setMulticast(enable); }
222 join(
const InetMcastAddress& ia, uint32 iface)
223 {
return recvSocket->join(ia,iface); }
226 drop(
const InetMcastAddress& ia)
227 {
return recvSocket->drop(ia); }
231 {
return sendSocket->setTimeToLive(ttl); }
234 setPeer(
const InetAddress& host, tpport_t port)
235 { sendSocket->setPeer(host,port); }
238 send(
const unsigned char*
const buffer,
size_t len)
239 {
return sendSocket->send(buffer, len); }
242 {
return recvSocket->getRecvSocket(); }
247 { sendSocket->endSocket(); recvSocket->endSocket(); }
250 BaseSocket* sendSocket;
251 BaseSocket* recvSocket;
277class RTPBaseUDPIPv6Socket :
private UDPSocket
283 RTPBaseUDPIPv6Socket(
const IPV6Address& ia, tpport_t port) :
287 inline ~RTPBaseUDPIPv6Socket()
292 {
return UDPSocket::isPending(UDPSocket::pendingInput, timeout); }
295 getSender(tpport_t& port)
const
296 {
return UDPSocket::getIPV6Sender(&port); }
299 recv(
unsigned char* buffer,
size_t len)
300 {
return UDPSocket::receive(buffer, len); }
306 getNextPacketSize()
const
307 {
size_t len;
ccioctl(UDPSocket::so,FIONREAD,len);
return len; }
310 setMulticast(
bool enable)
311 {
return UDPSocket::setMulticast(enable); }
314 join(
const IPV6Multicast& ia, uint32 iface)
315 {
return Socket::join(ia); }
318 drop(
const IPV6Multicast& ia)
319 {
return UDPSocket::drop(ia); }
322 setTimeToLive(
unsigned char ttl)
323 {
return UDPSocket::setTimeToLive(ttl); }
328 RTPBaseUDPIPv6Socket() :
333 setPeer(
const IPV6Host &ia, tpport_t port)
334 {UDPSocket::setPeer(ia, port);}
337 send(
const unsigned char*
const buffer,
size_t len)
338 {
return UDPSocket::send(buffer, len); }
340 inline SOCKET getRecvSocket()
const
341 {
return UDPSocket::so; }
346 { UDPSocket::endSocket(); }
369template<
class BaseSocket>
370class DualRTPChannelIPV6
373 DualRTPChannelIPV6(
const IPV6Host& ia, tpport_t port)
375 recvSocket =
new BaseSocket(ia,port);
376 sendSocket =
new BaseSocket;
379 inline ~DualRTPChannelIPV6()
380 {
delete sendSocket;
delete recvSocket; }
384 {
return recvSocket->isPendingRecv(timeout); }
387 getSender(tpport_t& port)
const
388 {
return recvSocket->getIPV6Sender(port); }
391 recv(
unsigned char* buffer,
size_t len)
392 {
return recvSocket->recv(buffer, len); }
395 getNextPacketSize()
const
396 {
return recvSocket->getNextPacketSize(); }
399 setMulticast(
bool enable)
400 { Socket::Error error = recvSocket->setMulticast(enable);
401 if (error)
return error;
402 return sendSocket->setMulticast(enable); }
405 join(
const IPV6Multicast& ia, uint32 iface)
406 {
return recvSocket->join(ia,iface); }
409 drop(
const IPV6Multicast& ia)
410 {
return recvSocket->drop(ia); }
413 setTimeToLive(
unsigned char ttl)
414 {
return sendSocket->setTimeToLive(ttl); }
417 setPeer(
const IPV6Host& host, tpport_t port)
418 { sendSocket->setPeer(host,port); }
421 send(
const unsigned char*
const buffer,
size_t len)
422 {
return sendSocket->send(buffer, len); }
424 inline SOCKET getRecvSocket()
const
425 {
return recvSocket->getRecvSocket(); }
430 { sendSocket->endSocket(); recvSocket->endSocket(); }
433 BaseSocket* sendSocket;
434 BaseSocket* recvSocket;
438typedef DualRTPChannelIPV6<RTPBaseUDPIPv6Socket> DualRTPUDPIPv6Channel;
439typedef RTPBaseUDPIPv6Socket SingleRTPChannelIPV6;
440typedef SingleRTPChannelIPV6 SymmetricRTPChannelIPV6;
Base elements for RTP stacks: constants, types and global functions.
uint32 microtimeout_t
Time interval expressed in microseconds.
Definition base.h:67
size_t ccioctl(int so, int request, size_t &len)
Definition channel.h:45
Socket::Error drop(const InetMcastAddress &ia)
Definition channel.h:226
DualRTPChannel(const InetAddress &ia, tpport_t port)
Definition channel.h:190
SOCKET getRecvSocket() const
Definition channel.h:241
void endSocket()
Definition channel.h:246
size_t send(const unsigned char *const buffer, size_t len)
Definition channel.h:238
bool isPendingRecv(microtimeout_t timeout) const
Definition channel.h:200
size_t getNextPacketSize() const
Definition channel.h:212
Socket::Error setTimeToLive(unsigned char ttl)
Definition channel.h:230
InetHostAddress getSender(tpport_t &port) const
Definition channel.h:204
~DualRTPChannel()
Definition channel.h:196
size_t recv(unsigned char *buffer, size_t len)
Definition channel.h:208
Socket::Error join(const InetMcastAddress &ia, uint32 iface)
Definition channel.h:222
void setPeer(const InetAddress &host, tpport_t port)
Definition channel.h:234
Socket::Error setMulticast(bool enable)
Definition channel.h:216
A UDP/IPv4 socket class targetted at RTP stacks.
Definition channel.h:95
size_t getNextPacketSize() const
Get size of next datagram waiting to be read.
Definition channel.h:123
size_t recv(unsigned char *buffer, size_t len)
Definition channel.h:116
SOCKET getRecvSocket() const
Definition channel.h:157
RTPBaseUDPIPv4Socket()
Constructor for transmitter.
Definition channel.h:145
Socket::Error join(const InetMcastAddress &ia, uint32 iface)
Definition channel.h:131
bool isPendingRecv(microtimeout_t timeout)
Definition channel.h:108
void endSocket()
Definition channel.h:162
Socket::Error drop(const InetMcastAddress &ia)
Definition channel.h:135
~RTPBaseUDPIPv4Socket()
Definition channel.h:104
size_t send(const unsigned char *const buffer, size_t len)
Definition channel.h:154
RTPBaseUDPIPv4Socket(const InetAddress &ia, tpport_t port)
Constructor for receiver.
Definition channel.h:100
Socket::Error setTimeToLive(unsigned char ttl)
Definition channel.h:139
InetHostAddress getSender(tpport_t &port) const
Definition channel.h:112
Socket::Error setMulticast(bool enable)
Definition channel.h:127
void setPeer(const InetAddress &ia, tpport_t port)
Definition channel.h:150
SingleRTPChannel SymmetricRTPChannel
Actually, RTP with a single channel can be called 'Symmetric RTP'.
Definition channel.h:455
RTPBaseUDPIPv4Socket SingleRTPChannel
May be used in applications where using the same socket for both sending and receiving is not a limit...
Definition channel.h:450
DualRTPChannel< RTPBaseUDPIPv4Socket > DualRTPUDPIPv4Channel
Definition channel.h:444