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_