mirror of
https://github.com/rofafor/vdr-plugin-iptv.git
synced 2023-10-10 13:37:03 +02:00
Moved JoinMulticast()/DropMulticast() into cIptvUdpSocket class.
This commit is contained in:
parent
2d583e8cfa
commit
ac458b0c36
@ -35,59 +35,25 @@ cIptvProtocolUdp::~cIptvProtocolUdp()
|
|||||||
free(sourceAddr);
|
free(sourceAddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cIptvProtocolUdp::JoinMulticast(void)
|
|
||||||
{
|
|
||||||
debug("cIptvProtocolUdp::JoinMulticast()\n");
|
|
||||||
// Check that stream address is valid
|
|
||||||
if (!isActive && !isempty(streamAddr)) {
|
|
||||||
// Ensure that socket is valid
|
|
||||||
OpenSocket(socketPort, isempty(sourceAddr) ? INADDR_ANY : inet_addr(sourceAddr));
|
|
||||||
// Join a new multicast group
|
|
||||||
struct ip_mreq mreq;
|
|
||||||
mreq.imr_multiaddr.s_addr = inet_addr(streamAddr);
|
|
||||||
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
|
|
||||||
int err = setsockopt(socketDesc, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,
|
|
||||||
sizeof(mreq));
|
|
||||||
ERROR_IF_RET(err < 0, "setsockopt()", return false);
|
|
||||||
// Update multicasting flag
|
|
||||||
isActive = true;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cIptvProtocolUdp::DropMulticast(void)
|
|
||||||
{
|
|
||||||
debug("cIptvProtocolUdp::DropMulticast()\n");
|
|
||||||
// Check that stream address is valid
|
|
||||||
if (isActive && !isempty(streamAddr)) {
|
|
||||||
// Ensure that socket is valid
|
|
||||||
OpenSocket(socketPort, isempty(sourceAddr) ? INADDR_ANY : inet_addr(sourceAddr));
|
|
||||||
// Drop the multicast group
|
|
||||||
struct ip_mreq mreq;
|
|
||||||
mreq.imr_multiaddr.s_addr = inet_addr(streamAddr);
|
|
||||||
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
|
|
||||||
int err = setsockopt(socketDesc, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq,
|
|
||||||
sizeof(mreq));
|
|
||||||
ERROR_IF_RET(err < 0, "setsockopt()", return false);
|
|
||||||
// Update multicasting flag
|
|
||||||
isActive = false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cIptvProtocolUdp::Open(void)
|
bool cIptvProtocolUdp::Open(void)
|
||||||
{
|
{
|
||||||
debug("cIptvProtocolUdp::Open()\n");
|
debug("cIptvProtocolUdp::Open()\n");
|
||||||
|
if (!isempty(streamAddr)) {
|
||||||
// Join a new multicast group
|
// Join a new multicast group
|
||||||
JoinMulticast();
|
OpenSocket(socketPort, isempty(sourceAddr) ? INADDR_ANY : inet_addr(sourceAddr));
|
||||||
|
JoinMulticast(inet_addr(streamAddr));
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cIptvProtocolUdp::Close(void)
|
bool cIptvProtocolUdp::Close(void)
|
||||||
{
|
{
|
||||||
debug("cIptvProtocolUdp::Close()\n");
|
debug("cIptvProtocolUdp::Close()\n");
|
||||||
|
if (!isempty(streamAddr)) {
|
||||||
// Drop the multicast group
|
// Drop the multicast group
|
||||||
DropMulticast();
|
OpenSocket(socketPort, isempty(sourceAddr) ? INADDR_ANY : inet_addr(sourceAddr));
|
||||||
|
DropMulticast(inet_addr(streamAddr));
|
||||||
|
}
|
||||||
// Close the socket
|
// Close the socket
|
||||||
CloseSocket();
|
CloseSocket();
|
||||||
return true;
|
return true;
|
||||||
@ -103,7 +69,10 @@ bool cIptvProtocolUdp::Set(const char* Location, const int Parameter, const int
|
|||||||
debug("cIptvProtocolUdp::Set(): Location=%s Parameter=%d Index=%d\n", Location, Parameter, Index);
|
debug("cIptvProtocolUdp::Set(): Location=%s Parameter=%d Index=%d\n", Location, Parameter, Index);
|
||||||
if (!isempty(Location)) {
|
if (!isempty(Location)) {
|
||||||
// Drop the multicast group
|
// Drop the multicast group
|
||||||
DropMulticast();
|
if (!isempty(streamAddr)) {
|
||||||
|
OpenSocket(socketPort, isempty(sourceAddr) ? INADDR_ANY : inet_addr(sourceAddr));
|
||||||
|
DropMulticast(inet_addr(streamAddr));
|
||||||
|
}
|
||||||
// Update stream address and port
|
// Update stream address and port
|
||||||
streamAddr = strcpyrealloc(streamAddr, Location);
|
streamAddr = strcpyrealloc(streamAddr, Location);
|
||||||
char *p = strstr(streamAddr, ";");
|
char *p = strstr(streamAddr, ";");
|
||||||
@ -115,7 +84,10 @@ bool cIptvProtocolUdp::Set(const char* Location, const int Parameter, const int
|
|||||||
sourceAddr = strcpyrealloc(sourceAddr, "");
|
sourceAddr = strcpyrealloc(sourceAddr, "");
|
||||||
socketPort = Parameter;
|
socketPort = Parameter;
|
||||||
// Join a new multicast group
|
// Join a new multicast group
|
||||||
JoinMulticast();
|
if (!isempty(streamAddr)) {
|
||||||
|
OpenSocket(socketPort, isempty(sourceAddr) ? INADDR_ANY : inet_addr(sourceAddr));
|
||||||
|
JoinMulticast(inet_addr(streamAddr));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -17,10 +17,6 @@ private:
|
|||||||
char* streamAddr;
|
char* streamAddr;
|
||||||
char* sourceAddr;
|
char* sourceAddr;
|
||||||
|
|
||||||
private:
|
|
||||||
bool JoinMulticast(void);
|
|
||||||
bool DropMulticast(void);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
cIptvProtocolUdp();
|
cIptvProtocolUdp();
|
||||||
virtual ~cIptvProtocolUdp();
|
virtual ~cIptvProtocolUdp();
|
||||||
|
33
socket.c
33
socket.c
@ -113,6 +113,39 @@ void cIptvUdpSocket::CloseSocket(void)
|
|||||||
cIptvSocket::CloseSocket();
|
cIptvSocket::CloseSocket();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool cIptvUdpSocket::JoinMulticast(const in_addr_t StreamAddr)
|
||||||
|
{
|
||||||
|
debug("cIptvUdpSocket::JoinMulticast()\n");
|
||||||
|
// Check if socket exists
|
||||||
|
if (!isActive && (socketDesc >= 0)) {
|
||||||
|
// Join a new multicast group
|
||||||
|
struct ip_mreq mreq;
|
||||||
|
mreq.imr_multiaddr.s_addr = StreamAddr;
|
||||||
|
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
|
||||||
|
ERROR_IF_RET(setsockopt(socketDesc, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0, "setsockopt(IP_ADD_MEMBERSHIP)", return false);
|
||||||
|
// Update multicasting flag
|
||||||
|
isActive = true;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cIptvUdpSocket::DropMulticast(const in_addr_t StreamAddr)
|
||||||
|
{
|
||||||
|
debug("cIptvUdpSocket::DropMulticast()\n");
|
||||||
|
// Check if socket exists
|
||||||
|
if (isActive && (socketDesc >= 0)) {
|
||||||
|
// Drop the existing multicast group
|
||||||
|
struct ip_mreq mreq;
|
||||||
|
mreq.imr_multiaddr.s_addr = StreamAddr;
|
||||||
|
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
|
||||||
|
ERROR_IF_RET(setsockopt(socketDesc, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) < 0, "setsockopt(IP_DROP_MEMBERSHIP)", return false);
|
||||||
|
// Update multicasting flag
|
||||||
|
isActive = false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int cIptvUdpSocket::Read(unsigned char* BufferAddr, unsigned int BufferLen)
|
int cIptvUdpSocket::Read(unsigned char* BufferAddr, unsigned int BufferLen)
|
||||||
{
|
{
|
||||||
//debug("cIptvUdpSocket::Read()\n");
|
//debug("cIptvUdpSocket::Read()\n");
|
||||||
|
2
socket.h
2
socket.h
@ -36,6 +36,8 @@ public:
|
|||||||
virtual int Read(unsigned char* BufferAddr, unsigned int BufferLen);
|
virtual int Read(unsigned char* BufferAddr, unsigned int BufferLen);
|
||||||
bool OpenSocket(const int Port, const in_addr_t SourceAddr = INADDR_ANY);
|
bool OpenSocket(const int Port, const in_addr_t SourceAddr = INADDR_ANY);
|
||||||
void CloseSocket(void);
|
void CloseSocket(void);
|
||||||
|
bool JoinMulticast(const in_addr_t StreamAddr);
|
||||||
|
bool DropMulticast(const in_addr_t StreamAddr);
|
||||||
};
|
};
|
||||||
|
|
||||||
class cIptvTcpSocket : public cIptvSocket {
|
class cIptvTcpSocket : public cIptvSocket {
|
||||||
|
Loading…
Reference in New Issue
Block a user