00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef CCRTP_CHANNEL_H_
00039 #define CCRTP_CHANNEL_H_
00040
00041 #include <ccrtp/base.h>
00042
00043 #ifndef WIN32
00044 #include <sys/ioctl.h>
00045 inline size_t ccioctl(SOCKET so, int request, size_t& len)
00046 { return ::ioctl(so,request,&len); }
00047 #else
00048 inline size_t ccioctl(SOCKET so, int request, size_t& len )
00049 {
00050 unsigned long l;
00051 size_t result = 0;
00052 ::ioctlsocket(so,request,&l);
00053 len = l;
00054 return result;
00055 }
00056 #endif
00057
00058 #ifdef CCXX_NAMESPACES
00059 namespace ost {
00060 #endif
00061
00096 class RTPBaseUDPIPv4Socket : private UDPSocket
00097 {
00098 public:
00102 RTPBaseUDPIPv4Socket(const InetAddress& ia, tpport_t port) :
00103 UDPSocket(ia,port)
00104 { }
00105
00106 inline ~RTPBaseUDPIPv4Socket()
00107 { endSocket(); }
00108
00109 inline bool
00110 isPendingRecv(microtimeout_t timeout)
00111 { return UDPSocket::isPending(UDPSocket::pendingInput, timeout); }
00112
00113 inline InetHostAddress
00114 getSender(tpport_t& port) const
00115 { return UDPSocket::getSender(&port); }
00116
00117 inline size_t
00118 recv(unsigned char* buffer, size_t len)
00119 { return UDPSocket::receive(buffer, len); }
00120
00124 inline size_t
00125 getNextPacketSize() const
00126 { size_t len; ccioctl(UDPSocket::so,FIONREAD,len); return len; }
00127
00128 Socket::Error
00129 setMulticast(bool enable)
00130 { return UDPSocket::setMulticast(enable); }
00131
00132 inline Socket::Error
00133 join(const InetMcastAddress& ia, uint32 iface)
00134 { return UDPSocket::join(ia,iface); }
00135
00136 inline Socket::Error
00137 drop(const InetMcastAddress& ia)
00138 { return UDPSocket::drop(ia); }
00139
00140 inline Socket::Error
00141 setTimeToLive(unsigned char ttl)
00142 { return UDPSocket::setTimeToLive(ttl); }
00143
00147 RTPBaseUDPIPv4Socket() :
00148 UDPSocket()
00149 { }
00150
00151 inline void
00152 setPeer(const InetAddress &ia, tpport_t port)
00153 {UDPSocket::setPeer((InetHostAddress&)ia, port);}
00154
00155 inline size_t
00156 send(const unsigned char* const buffer, size_t len)
00157 { return UDPSocket::send(buffer, len); }
00158
00159 inline SOCKET getRecvSocket() const
00160 { return UDPSocket::so; }
00161
00162
00163 inline void
00164 endSocket()
00165 { UDPSocket::endSocket(); }
00166 };
00167
00188 template<class BaseSocket>
00189 class DualRTPChannel
00190 {
00191 public:
00192 DualRTPChannel(const InetAddress& ia, tpport_t port)
00193 {
00194 recvSocket = new BaseSocket(ia,port);
00195 sendSocket = new BaseSocket;
00196 }
00197
00198 inline ~DualRTPChannel()
00199 { delete sendSocket; delete recvSocket; }
00200
00201 inline bool
00202 isPendingRecv(microtimeout_t timeout) const
00203 { return recvSocket->isPendingRecv(timeout); }
00204
00205 inline InetHostAddress
00206 getSender(tpport_t& port) const
00207 { return recvSocket->getSender(port); }
00208
00209 inline size_t
00210 recv(unsigned char* buffer, size_t len)
00211 { return recvSocket->recv(buffer, len); }
00212
00213 inline size_t
00214 getNextPacketSize() const
00215 { return recvSocket->getNextPacketSize(); }
00216
00217 inline Socket::Error
00218 setMulticast(bool enable)
00219 { Socket::Error error = recvSocket->setMulticast(enable);
00220 if (error) return error;
00221 return sendSocket->setMulticast(enable); }
00222
00223 inline Socket::Error
00224 join(const InetMcastAddress& ia, uint32 iface)
00225 { return recvSocket->join(ia,iface); }
00226
00227 inline Socket::Error
00228 drop(const InetMcastAddress& ia)
00229 { return recvSocket->drop(ia); }
00230
00231 inline Socket::Error
00232 setTimeToLive(unsigned char ttl)
00233 { return sendSocket->setTimeToLive(ttl); }
00234
00235 inline void
00236 setPeer(const InetAddress& host, tpport_t port)
00237 { sendSocket->setPeer(host,port); }
00238
00239 inline size_t
00240 send(const unsigned char* const buffer, size_t len)
00241 { return sendSocket->send(buffer, len); }
00242
00243 inline SOCKET getRecvSocket() const
00244 { return recvSocket->getRecvSocket(); }
00245
00246
00247 inline void
00248 endSocket()
00249 { sendSocket->endSocket(); recvSocket->endSocket(); }
00250
00251 private:
00252 BaseSocket* sendSocket;
00253 BaseSocket* recvSocket;
00254 };
00255
00256 #ifdef CCXX_IPV6
00257
00279 class RTPBaseUDPIPv6Socket : private UDPSocket
00280 {
00281 public:
00285 RTPBaseUDPIPv6Socket(const IPV6Address& ia, tpport_t port) :
00286 UDPSocket(ia,port)
00287 { }
00288
00289 inline ~RTPBaseUDPIPv6Socket()
00290 { endSocket(); }
00291
00292 inline bool
00293 isPendingRecv(microtimeout_t timeout)
00294 { return UDPSocket::isPending(UDPSocket::pendingInput, timeout); }
00295
00296 inline IPV6Host
00297 getSender(tpport_t& port) const
00298 { return UDPSocket::getIPV6Sender(&port); }
00299
00300 inline size_t
00301 recv(unsigned char* buffer, size_t len)
00302 { return UDPSocket::receive(buffer, len); }
00303
00307 inline size_t
00308 getNextPacketSize() const
00309 { size_t len; ccioctl(UDPSocket::so,FIONREAD,len); return len; }
00310
00311 Socket::Error
00312 setMulticast(bool enable)
00313 { return UDPSocket::setMulticast(enable); }
00314
00315 inline Socket::Error
00316 join(const IPV6Multicast& ia, uint32 iface)
00317 { return Socket::join(ia); }
00318
00319 inline Socket::Error
00320 drop(const IPV6Multicast& ia)
00321 { return UDPSocket::drop(ia); }
00322
00323 inline Socket::Error
00324 setTimeToLive(unsigned char ttl)
00325 { return UDPSocket::setTimeToLive(ttl); }
00326
00330 RTPBaseUDPIPv6Socket() :
00331 UDPSocket()
00332 { }
00333
00334 inline void
00335 setPeer(const IPV6Host &ia, tpport_t port)
00336 {UDPSocket::setPeer(ia, port);}
00337
00338 inline size_t
00339 send(const unsigned char* const buffer, size_t len)
00340 { return UDPSocket::send(buffer, len); }
00341
00342 inline SOCKET getRecvSocket() const
00343 { return UDPSocket::so; }
00344
00345
00346 inline void
00347 endSocket()
00348 { UDPSocket::endSocket(); }
00349 };
00350
00371 template<class BaseSocket>
00372 class DualRTPChannelIPV6
00373 {
00374 public:
00375 DualRTPChannelIPV6(const IPV6Host& ia, tpport_t port)
00376 {
00377 recvSocket = new BaseSocket(ia,port);
00378 sendSocket = new BaseSocket;
00379 }
00380
00381 inline ~DualRTPChannelIPV6()
00382 { delete sendSocket; delete recvSocket; }
00383
00384 inline bool
00385 isPendingRecv(microtimeout_t timeout) const
00386 { return recvSocket->isPendingRecv(timeout); }
00387
00388 inline IPV6Host
00389 getSender(tpport_t& port) const
00390 { return recvSocket->getIPV6Sender(port); }
00391
00392 inline size_t
00393 recv(unsigned char* buffer, size_t len)
00394 { return recvSocket->recv(buffer, len); }
00395
00396 inline size_t
00397 getNextPacketSize() const
00398 { return recvSocket->getNextPacketSize(); }
00399
00400 inline Socket::Error
00401 setMulticast(bool enable)
00402 { Socket::Error error = recvSocket->setMulticast(enable);
00403 if (error) return error;
00404 return sendSocket->setMulticast(enable); }
00405
00406 inline Socket::Error
00407 join(const IPV6Multicast& ia, uint32 iface)
00408 { return recvSocket->join(ia,iface); }
00409
00410 inline Socket::Error
00411 drop(const IPV6Multicast& ia)
00412 { return recvSocket->drop(ia); }
00413
00414 inline Socket::Error
00415 setTimeToLive(unsigned char ttl)
00416 { return sendSocket->setTimeToLive(ttl); }
00417
00418 inline void
00419 setPeer(const IPV6Host& host, tpport_t port)
00420 { sendSocket->setPeer(host,port); }
00421
00422 inline size_t
00423 send(const unsigned char* const buffer, size_t len)
00424 { return sendSocket->send(buffer, len); }
00425
00426 inline SOCKET getRecvSocket() const
00427 { return recvSocket->getRecvSocket(); }
00428
00429
00430 inline void
00431 endSocket()
00432 { sendSocket->endSocket(); recvSocket->endSocket(); }
00433
00434 private:
00435 BaseSocket* sendSocket;
00436 BaseSocket* recvSocket;
00437 };
00438
00439
00440 typedef DualRTPChannelIPV6<RTPBaseUDPIPv6Socket> DualRTPUDPIPv6Channel;
00441 typedef RTPBaseUDPIPv6Socket SingleRTPChannelIPV6;
00442 typedef SingleRTPChannelIPV6 SymmetricRTPChannelIPV6;
00443
00444 #endif
00445
00446 typedef DualRTPChannel<RTPBaseUDPIPv4Socket> DualRTPUDPIPv4Channel;
00447
00452 typedef RTPBaseUDPIPv4Socket SingleRTPChannel;
00453
00457 typedef SingleRTPChannel SymmetricRTPChannel;
00458
00460
00461 #ifdef CCXX_NAMESPACES
00462 }
00463 #endif
00464
00465 #endif //CCRTP_CHANNEL_H_
00466