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 { return recvSocket->setMulticast(enable); }
00220
00221 inline Socket::Error
00222 join(const InetMcastAddress& ia, uint32 iface)
00223 { return recvSocket->join(ia,iface); }
00224
00225 inline Socket::Error
00226 drop(const InetMcastAddress& ia)
00227 { return recvSocket->drop(ia); }
00228
00229 inline Socket::Error
00230 setTimeToLive(unsigned char ttl)
00231 { return recvSocket->setTimeToLive(ttl); }
00232
00233 inline void
00234 setPeer(const InetAddress& host, tpport_t port)
00235 { sendSocket->setPeer(host,port); }
00236
00237 inline size_t
00238 send(const unsigned char* const buffer, size_t len)
00239 { return sendSocket->send(buffer, len); }
00240
00241 inline SOCKET getRecvSocket() const
00242 { return recvSocket->getRecvSocket(); }
00243
00244
00245 inline void
00246 endSocket()
00247 { sendSocket->endSocket(); recvSocket->endSocket(); }
00248
00249 private:
00250 BaseSocket* sendSocket;
00251 BaseSocket* recvSocket;
00252 };
00253
00254 #ifdef CCXX_IPV6
00255
00277 class RTPBaseUDPIPv6Socket : private UDPSocket
00278 {
00279 public:
00283 RTPBaseUDPIPv6Socket(const IPV6Address& ia, tpport_t port) :
00284 UDPSocket(ia,port)
00285 { }
00286
00287 inline ~RTPBaseUDPIPv6Socket()
00288 { endSocket(); }
00289
00290 inline bool
00291 isPendingRecv(microtimeout_t timeout)
00292 { return UDPSocket::isPending(UDPSocket::pendingInput, timeout); }
00293
00294 inline IPV6Host
00295 getSender(tpport_t& port) const
00296 { return UDPSocket::getIPV6Sender(&port); }
00297
00298 inline size_t
00299 recv(unsigned char* buffer, size_t len)
00300 { return UDPSocket::receive(buffer, len); }
00301
00305 inline size_t
00306 getNextPacketSize() const
00307 { size_t len; ccioctl(UDPSocket::so,FIONREAD,len); return len; }
00308
00309 Socket::Error
00310 setMulticast(bool enable)
00311 { return UDPSocket::setMulticast(enable); }
00312
00313 inline Socket::Error
00314 join(const IPV6Multicast& ia, uint32 iface)
00315 { return Socket::join(ia); }
00316
00317 inline Socket::Error
00318 drop(const IPV6Multicast& ia)
00319 { return UDPSocket::drop(ia); }
00320
00321 inline Socket::Error
00322 setTimeToLive(unsigned char ttl)
00323 { return UDPSocket::setTimeToLive(ttl); }
00324
00328 RTPBaseUDPIPv6Socket() :
00329 UDPSocket()
00330 { }
00331
00332 inline void
00333 setPeer(const IPV6Host &ia, tpport_t port)
00334 {UDPSocket::setPeer(ia, port);}
00335
00336 inline size_t
00337 send(const unsigned char* const buffer, size_t len)
00338 { return UDPSocket::send(buffer, len); }
00339
00340 inline SOCKET getRecvSocket() const
00341 { return UDPSocket::so; }
00342
00343
00344 inline void
00345 endSocket()
00346 { UDPSocket::endSocket(); }
00347 };
00348
00369 template<class BaseSocket>
00370 class DualRTPChannelIPV6
00371 {
00372 public:
00373 DualRTPChannelIPV6(const IPV6Host& ia, tpport_t port)
00374 {
00375 recvSocket = new BaseSocket(ia,port);
00376 sendSocket = new BaseSocket;
00377 }
00378
00379 inline ~DualRTPChannelIPV6()
00380 { delete sendSocket; delete recvSocket; }
00381
00382 inline bool
00383 isPendingRecv(microtimeout_t timeout) const
00384 { return recvSocket->isPendingRecv(timeout); }
00385
00386 inline IPV6Host
00387 getSender(tpport_t& port) const
00388 { return recvSocket->getIPV6Sender(port); }
00389
00390 inline size_t
00391 recv(unsigned char* buffer, size_t len)
00392 { return recvSocket->recv(buffer, len); }
00393
00394 inline size_t
00395 getNextPacketSize() const
00396 { return recvSocket->getNextPacketSize(); }
00397
00398 inline Socket::Error
00399 setMulticast(bool enable)
00400 { return recvSocket->setMulticast(enable); }
00401
00402 inline Socket::Error
00403 join(const IPV6Multicast& ia, uint32 iface)
00404 { return recvSocket->join(ia,iface); }
00405
00406 inline Socket::Error
00407 drop(const IPV6Multicast& ia)
00408 { return recvSocket->drop(ia); }
00409
00410 inline Socket::Error
00411 setTimeToLive(unsigned char ttl)
00412 { return recvSocket->setTimeToLive(ttl); }
00413
00414 inline void
00415 setPeer(const IPV6Host& host, tpport_t port)
00416 { sendSocket->setPeer(host,port); }
00417
00418 inline size_t
00419 send(const unsigned char* const buffer, size_t len)
00420 { return sendSocket->send(buffer, len); }
00421
00422 inline SOCKET getRecvSocket() const
00423 { return recvSocket->getRecvSocket(); }
00424
00425
00426 inline void
00427 endSocket()
00428 { sendSocket->endSocket(); recvSocket->endSocket(); }
00429
00430 private:
00431 BaseSocket* sendSocket;
00432 BaseSocket* recvSocket;
00433 };
00434
00435
00436 typedef DualRTPChannelIPV6<RTPBaseUDPIPv6Socket> DualRTPUDPIPv6Channel;
00437 typedef RTPBaseUDPIPv6Socket SingleRTPChannelIPV6;
00438 typedef SingleRTPChannelIPV6 SymmetricRTPChannelIPV6;
00439
00440 #endif
00441
00442 typedef DualRTPChannel<RTPBaseUDPIPv4Socket> DualRTPUDPIPv4Channel;
00443
00448 typedef RTPBaseUDPIPv4Socket SingleRTPChannel;
00449
00453 typedef SingleRTPChannel SymmetricRTPChannel;
00454
00456
00457 #ifdef CCXX_NAMESPACES
00458 }
00459 #endif
00460
00461 #endif //CCRTP_CHANNEL_H_
00462