38 #ifndef CCRTP_CHANNEL_H_
39 #define CCRTP_CHANNEL_H_
44 #include <sys/ioctl.h>
45 inline size_t ccioctl(SOCKET so,
int request,
size_t& len)
46 { return ::ioctl(so,request,&len); }
48 inline size_t ccioctl(SOCKET so,
int request,
size_t& len )
52 ::ioctlsocket(so,request,&l);
58 #ifdef CCXX_NAMESPACES
111 {
return UDPSocket::isPending(UDPSocket::pendingInput, timeout); }
113 inline InetHostAddress
114 getSender(tpport_t& port)
const
115 {
return UDPSocket::getSender(&port); }
118 recv(
unsigned char* buffer,
size_t len)
119 {
return UDPSocket::receive(buffer, len); }
125 getNextPacketSize()
const
126 {
size_t len;
ccioctl(UDPSocket::so,FIONREAD,len);
return len; }
129 setMulticast(
bool enable)
130 {
return UDPSocket::setMulticast(enable); }
133 join(
const InetMcastAddress& ia, uint32 iface)
134 {
return UDPSocket::join(ia,iface); }
137 drop(
const InetMcastAddress& ia)
138 {
return UDPSocket::drop(ia); }
141 setTimeToLive(
unsigned char ttl)
142 {
return UDPSocket::setTimeToLive(ttl); }
152 setPeer(
const InetAddress &ia, tpport_t port)
153 {UDPSocket::setPeer((InetHostAddress&)ia, port);}
156 send(
const unsigned char*
const buffer,
size_t len)
157 {
return UDPSocket::send(buffer, len); }
159 inline SOCKET getRecvSocket()
const
160 {
return UDPSocket::so; }
165 { UDPSocket::endSocket(); }
188 template<
class BaseSocket>
194 recvSocket =
new BaseSocket(ia,port);
195 sendSocket =
new BaseSocket;
199 {
delete sendSocket;
delete recvSocket; }
205 inline InetHostAddress
206 getSender(tpport_t& port)
const
207 {
return recvSocket->getSender(port); }
210 recv(
unsigned char* buffer,
size_t len)
211 {
return recvSocket->recv(buffer, len); }
214 getNextPacketSize()
const
215 {
return recvSocket->getNextPacketSize(); }
218 setMulticast(
bool enable)
219 { Socket::Error error = recvSocket->setMulticast(enable);
220 if (error)
return error;
221 return sendSocket->setMulticast(enable); }
224 join(
const InetMcastAddress& ia, uint32 iface)
225 {
return recvSocket->join(ia,iface); }
228 drop(
const InetMcastAddress& ia)
229 {
return recvSocket->drop(ia); }
232 setTimeToLive(
unsigned char ttl)
233 {
return sendSocket->setTimeToLive(ttl); }
236 setPeer(
const InetAddress& host, tpport_t port)
237 { sendSocket->setPeer(host,port); }
240 send(
const unsigned char*
const buffer,
size_t len)
241 {
return sendSocket->send(buffer, len); }
243 inline SOCKET getRecvSocket()
const
244 {
return recvSocket->getRecvSocket(); }
249 { sendSocket->endSocket(); recvSocket->endSocket(); }
252 BaseSocket* sendSocket;
253 BaseSocket* recvSocket;
279 class RTPBaseUDPIPv6Socket :
private UDPSocket
285 RTPBaseUDPIPv6Socket(
const IPV6Address& ia, tpport_t port) :
289 inline ~RTPBaseUDPIPv6Socket()
294 {
return UDPSocket::isPending(UDPSocket::pendingInput, timeout); }
297 getSender(tpport_t& port)
const
298 {
return UDPSocket::getIPV6Sender(&port); }
301 recv(
unsigned char* buffer,
size_t len)
302 {
return UDPSocket::receive(buffer, len); }
308 getNextPacketSize()
const
309 {
size_t len;
ccioctl(UDPSocket::so,FIONREAD,len);
return len; }
312 setMulticast(
bool enable)
313 {
return UDPSocket::setMulticast(enable); }
316 join(
const IPV6Multicast& ia, uint32 iface)
317 {
return Socket::join(ia); }
320 drop(
const IPV6Multicast& ia)
321 {
return UDPSocket::drop(ia); }
324 setTimeToLive(
unsigned char ttl)
325 {
return UDPSocket::setTimeToLive(ttl); }
330 RTPBaseUDPIPv6Socket() :
335 setPeer(
const IPV6Host &ia, tpport_t port)
336 {UDPSocket::setPeer(ia, port);}
339 send(
const unsigned char*
const buffer,
size_t len)
340 {
return UDPSocket::send(buffer, len); }
342 inline SOCKET getRecvSocket()
const
343 {
return UDPSocket::so; }
348 { UDPSocket::endSocket(); }
371 template<
class BaseSocket>
372 class DualRTPChannelIPV6
375 DualRTPChannelIPV6(
const IPV6Host& ia, tpport_t port)
377 recvSocket =
new BaseSocket(ia,port);
378 sendSocket =
new BaseSocket;
381 inline ~DualRTPChannelIPV6()
382 {
delete sendSocket;
delete recvSocket; }
386 {
return recvSocket->isPendingRecv(timeout); }
389 getSender(tpport_t& port)
const
390 {
return recvSocket->getIPV6Sender(port); }
393 recv(
unsigned char* buffer,
size_t len)
394 {
return recvSocket->recv(buffer, len); }
397 getNextPacketSize()
const
398 {
return recvSocket->getNextPacketSize(); }
401 setMulticast(
bool enable)
402 { Socket::Error error = recvSocket->setMulticast(enable);
403 if (error)
return error;
404 return sendSocket->setMulticast(enable); }
407 join(
const IPV6Multicast& ia, uint32 iface)
408 {
return recvSocket->join(ia,iface); }
411 drop(
const IPV6Multicast& ia)
412 {
return recvSocket->drop(ia); }
415 setTimeToLive(
unsigned char ttl)
416 {
return sendSocket->setTimeToLive(ttl); }
419 setPeer(
const IPV6Host& host, tpport_t port)
420 { sendSocket->setPeer(host,port); }
423 send(
const unsigned char*
const buffer,
size_t len)
424 {
return sendSocket->send(buffer, len); }
426 inline SOCKET getRecvSocket()
const
427 {
return recvSocket->getRecvSocket(); }
432 { sendSocket->endSocket(); recvSocket->endSocket(); }
435 BaseSocket* sendSocket;
436 BaseSocket* recvSocket;
440 typedef DualRTPChannelIPV6<RTPBaseUDPIPv6Socket> DualRTPUDPIPv6Channel;
441 typedef RTPBaseUDPIPv6Socket SingleRTPChannelIPV6;
442 typedef SingleRTPChannelIPV6 SymmetricRTPChannelIPV6;
461 #ifdef CCXX_NAMESPACES
465 #endif //CCRTP_CHANNEL_H_