38 #ifndef CCRTP_CHANNEL_H_
39 #define CCRTP_CHANNEL_H_
42 #include <commoncpp/socket.h>
45 #include <sys/ioctl.h>
46 inline size_t ccioctl(
int so,
int request,
size_t& len)
47 {
return ioctl(so,request,&len); }
49 inline size_t ccioctl(SOCKET so,
int request,
size_t& len )
53 ::ioctlsocket(so,request,&l);
110 {
return UDPSocket::isPending(UDPSocket::pendingInput, timeout); }
112 inline InetHostAddress
114 {
return UDPSocket::getSender(&port); }
117 recv(
unsigned char* buffer,
size_t len)
118 {
return UDPSocket::receive(buffer, len); }
125 {
size_t len;
ccioctl(UDPSocket::so,FIONREAD,len);
return len; }
129 {
return UDPSocket::setMulticast(enable); }
132 join(
const InetMcastAddress& ia, uint32 iface)
133 {
return UDPSocket::join(ia,iface); }
136 drop(
const InetMcastAddress& ia)
137 {
return UDPSocket::drop(ia); }
141 {
return UDPSocket::setTimeToLive(ttl); }
152 {UDPSocket::setPeer((InetHostAddress&)ia, port);}
155 send(
const unsigned char*
const buffer,
size_t len)
156 {
return UDPSocket::send(buffer, len); }
159 {
return UDPSocket::so; }
164 { UDPSocket::endSocket(); }
187 template<
class BaseSocket>
193 recvSocket =
new BaseSocket(ia,port);
194 sendSocket =
new BaseSocket;
198 {
delete sendSocket;
delete recvSocket; }
202 {
return recvSocket->isPendingRecv(timeout); }
204 inline InetHostAddress
206 {
return recvSocket->getSender(port); }
209 recv(
unsigned char* buffer,
size_t len)
210 {
return recvSocket->recv(buffer, len); }
214 {
return recvSocket->getNextPacketSize(); }
218 { Socket::Error error = recvSocket->setMulticast(enable);
219 if (error)
return error;
220 return sendSocket->setMulticast(enable); }
223 join(
const InetMcastAddress& ia, uint32 iface)
224 {
return recvSocket->join(ia,iface); }
227 drop(
const InetMcastAddress& ia)
228 {
return recvSocket->drop(ia); }
232 {
return sendSocket->setTimeToLive(ttl); }
235 setPeer(
const InetAddress& host, tpport_t port)
236 { sendSocket->setPeer(host,port); }
239 send(
const unsigned char*
const buffer,
size_t len)
240 {
return sendSocket->send(buffer, len); }
243 {
return recvSocket->getRecvSocket(); }
248 { sendSocket->endSocket(); recvSocket->endSocket(); }
251 BaseSocket* sendSocket;
252 BaseSocket* recvSocket;
278 class RTPBaseUDPIPv6Socket :
private UDPSocket
284 RTPBaseUDPIPv6Socket(
const IPV6Address& ia, tpport_t port) :
288 inline ~RTPBaseUDPIPv6Socket()
293 {
return UDPSocket::isPending(UDPSocket::pendingInput, timeout); }
296 getSender(tpport_t& port)
const
297 {
return UDPSocket::getIPV6Sender(&port); }
300 recv(
unsigned char* buffer,
size_t len)
301 {
return UDPSocket::receive(buffer, len); }
307 getNextPacketSize()
const
308 {
size_t len;
ccioctl(UDPSocket::so,FIONREAD,len);
return len; }
311 setMulticast(
bool enable)
312 {
return UDPSocket::setMulticast(enable); }
315 join(
const IPV6Multicast& ia, uint32 iface)
316 {
return Socket::join(ia); }
319 drop(
const IPV6Multicast& ia)
320 {
return UDPSocket::drop(ia); }
323 setTimeToLive(
unsigned char ttl)
324 {
return UDPSocket::setTimeToLive(ttl); }
329 RTPBaseUDPIPv6Socket() :
334 setPeer(
const IPV6Host &ia, tpport_t port)
335 {UDPSocket::setPeer(ia, port);}
338 send(
const unsigned char*
const buffer,
size_t len)
339 {
return UDPSocket::send(buffer, len); }
341 inline SOCKET getRecvSocket()
const
342 {
return UDPSocket::so; }
347 { UDPSocket::endSocket(); }
370 template<
class BaseSocket>
371 class DualRTPChannelIPV6
374 DualRTPChannelIPV6(
const IPV6Host& ia, tpport_t port)
376 recvSocket =
new BaseSocket(ia,port);
377 sendSocket =
new BaseSocket;
380 inline ~DualRTPChannelIPV6()
381 {
delete sendSocket;
delete recvSocket; }
385 {
return recvSocket->isPendingRecv(timeout); }
388 getSender(tpport_t& port)
const
389 {
return recvSocket->getIPV6Sender(port); }
392 recv(
unsigned char* buffer,
size_t len)
393 {
return recvSocket->recv(buffer, len); }
396 getNextPacketSize()
const
397 {
return recvSocket->getNextPacketSize(); }
400 setMulticast(
bool enable)
401 { Socket::Error error = recvSocket->setMulticast(enable);
402 if (error)
return error;
403 return sendSocket->setMulticast(enable); }
406 join(
const IPV6Multicast& ia, uint32 iface)
407 {
return recvSocket->join(ia,iface); }
410 drop(
const IPV6Multicast& ia)
411 {
return recvSocket->drop(ia); }
414 setTimeToLive(
unsigned char ttl)
415 {
return sendSocket->setTimeToLive(ttl); }
418 setPeer(
const IPV6Host& host, tpport_t port)
419 { sendSocket->setPeer(host,port); }
422 send(
const unsigned char*
const buffer,
size_t len)
423 {
return sendSocket->send(buffer, len); }
425 inline SOCKET getRecvSocket()
const
426 {
return recvSocket->getRecvSocket(); }
431 { sendSocket->endSocket(); recvSocket->endSocket(); }
434 BaseSocket* sendSocket;
435 BaseSocket* recvSocket;
439 typedef DualRTPChannelIPV6<RTPBaseUDPIPv6Socket> DualRTPUDPIPv6Channel;
440 typedef RTPBaseUDPIPv6Socket SingleRTPChannelIPV6;
441 typedef SingleRTPChannelIPV6 SymmetricRTPChannelIPV6;
462 #endif //CCRTP_CHANNEL_H_
size_t recv(unsigned char *buffer, size_t len)
Definition: channel.h:209
DualRTPChannel< RTPBaseUDPIPv4Socket > DualRTPUDPIPv4Channel
Definition: channel.h:445
uint32 microtimeout_t
Time interval expressed in microseconds.
Definition: base.h:68
~RTPBaseUDPIPv4Socket()
Definition: channel.h:105
size_t send(const unsigned char *const buffer, size_t len)
Definition: channel.h:239
DualRTPChannel(const InetAddress &ia, tpport_t port)
Definition: channel.h:191
void endSocket()
Definition: channel.h:163
RTPBaseUDPIPv4Socket(const InetAddress &ia, tpport_t port)
Constructor for receiver.
Definition: channel.h:101
size_t getNextPacketSize() const
Get size of next datagram waiting to be read.
Definition: channel.h:124
Socket::Error setTimeToLive(unsigned char ttl)
Definition: channel.h:231
SingleRTPChannel SymmetricRTPChannel
Actually, RTP with a single channel can be called 'Symmetric RTP'.
Definition: channel.h:456
size_t recv(unsigned char *buffer, size_t len)
Definition: channel.h:117
size_t send(const unsigned char *const buffer, size_t len)
Definition: channel.h:155
void setPeer(const InetAddress &ia, tpport_t port)
Definition: channel.h:151
Socket::Error setMulticast(bool enable)
Definition: channel.h:217
Socket::Error drop(const InetMcastAddress &ia)
Definition: channel.h:136
InetHostAddress getSender(tpport_t &port) const
Definition: channel.h:205
InetHostAddress getSender(tpport_t &port) const
Definition: channel.h:113
RTPBaseUDPIPv4Socket()
Constructor for transmitter.
Definition: channel.h:146
Definition: channel.h:188
size_t getNextPacketSize() const
Definition: channel.h:213
Socket::Error join(const InetMcastAddress &ia, uint32 iface)
Definition: channel.h:132
SOCKET getRecvSocket() const
Definition: channel.h:158
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
SOCKET getRecvSocket() const
Definition: channel.h:242
A UDP/IPv4 socket class targetted at RTP stacks.
Definition: channel.h:95
~DualRTPChannel()
Definition: channel.h:197
Socket::Error setMulticast(bool enable)
Definition: channel.h:128
Socket::Error join(const InetMcastAddress &ia, uint32 iface)
Definition: channel.h:223
void setPeer(const InetAddress &host, tpport_t port)
Definition: channel.h:235
Base elements for RTP stacks: constants, types and global functions.
void endSocket()
Definition: channel.h:247
bool isPendingRecv(microtimeout_t timeout) const
Definition: channel.h:201
bool isPendingRecv(microtimeout_t timeout)
Definition: channel.h:109
size_t ccioctl(int so, int request, size_t &len)
Definition: channel.h:46
Socket::Error setTimeToLive(unsigned char ttl)
Definition: channel.h:140
Socket::Error drop(const InetMcastAddress &ia)
Definition: channel.h:227