diff options
author | schmirl <schmirl> | 2009-02-13 10:39:20 +0000 |
---|---|---|
committer | schmirl <schmirl> | 2009-02-13 10:39:20 +0000 |
commit | 78410ea5761eab03a7bc33852e85621594df7254 (patch) | |
tree | 38b0238e9797d4ab97fee50c822518ff460def16 /tools | |
parent | c26b89f9c287d64915b94cc56fb0e4e709d235a4 (diff) | |
download | vdr-plugin-streamdev-78410ea5761eab03a7bc33852e85621594df7254.tar.gz vdr-plugin-streamdev-78410ea5761eab03a7bc33852e85621594df7254.tar.bz2 |
Added IGMP multicast server
Modified Files:
CONTRIBUTORS HISTORY Makefile README po/de_DE.po po/fi_FI.po
po/fr_FR.po po/it_IT.po po/ru_RU.po server/component.c
server/component.h server/connection.c server/connection.h
server/livefilter.c server/server.c server/setup.c
server/setup.h server/streamer.c server/streamer.h
streamdev/streamdevhosts.conf tools/socket.c tools/socket.h
Added Files:
patches/vdr-cap_net_raw.diff server/componentIGMP.c
server/componentIGMP.h server/connectionIGMP.c
server/connectionIGMP.h
Diffstat (limited to 'tools')
-rw-r--r-- | tools/socket.c | 24 | ||||
-rw-r--r-- | tools/socket.h | 16 |
2 files changed, 28 insertions, 12 deletions
diff --git a/tools/socket.c b/tools/socket.c index 7f4ce0a..3523c29 100644 --- a/tools/socket.c +++ b/tools/socket.c @@ -1,5 +1,6 @@ #include "tools/socket.h" +#include <vdr/tools.h> #include <string.h> #include <arpa/inet.h> #include <unistd.h> @@ -15,10 +16,11 @@ // actual DSCP value used #define STREAMDEV_DSCP DSCP_AF41 -cTBSocket::cTBSocket(int Type) { +cTBSocket::cTBSocket(int Type, int Protocol) { memset(&m_LocalAddr, 0, sizeof(m_LocalAddr)); memset(&m_RemoteAddr, 0, sizeof(m_RemoteAddr)); m_Type = Type; + m_Protocol = Protocol; } cTBSocket::~cTBSocket() { @@ -31,7 +33,7 @@ bool cTBSocket::Connect(const std::string &Host, unsigned int Port) { if (IsOpen()) Close(); - if ((socket = ::socket(PF_INET, m_Type, IPPROTO_IP)) == -1) + if ((socket = ::socket(PF_INET, m_Type, m_Protocol)) == -1) return false; m_LocalAddr.sin_family = AF_INET; @@ -52,10 +54,12 @@ bool cTBSocket::Connect(const std::string &Host, unsigned int Port) { return false; } - len = sizeof(struct sockaddr_in); - if (::getpeername(socket, (struct sockaddr*)&m_RemoteAddr, &len) == -1) { - ::close(socket); - return false; + if (m_Type == SOCK_STREAM) { + len = sizeof(struct sockaddr_in); + if (::getpeername(socket, (struct sockaddr*)&m_RemoteAddr, &len) == -1) { + ::close(socket); + return false; + } } len = sizeof(struct sockaddr_in); @@ -64,7 +68,11 @@ bool cTBSocket::Connect(const std::string &Host, unsigned int Port) { return false; } - return cTBSource::Open(socket); + if (!cTBSource::Open(socket)) { + ::close(socket); + return false; + } + return true; } bool cTBSocket::Listen(const std::string &Ip, unsigned int Port, int BackLog) { @@ -74,7 +82,7 @@ bool cTBSocket::Listen(const std::string &Ip, unsigned int Port, int BackLog) { if (IsOpen()) Close(); - if ((socket = ::socket(PF_INET, m_Type, IPPROTO_IP)) == -1) + if ((socket = ::socket(PF_INET, m_Type, m_Protocol)) == -1) return false; val = 1; diff --git a/tools/socket.h b/tools/socket.h index 23272ec..3dc7a33 100644 --- a/tools/socket.h +++ b/tools/socket.h @@ -18,9 +18,10 @@ private: struct sockaddr_in m_RemoteAddr; int m_Type; + int m_Protocol; public: - cTBSocket(int Type = SOCK_STREAM); + cTBSocket(int Type = SOCK_STREAM, int Protocol = 0); virtual ~cTBSocket(); /* See cTBSource::SysRead() @@ -97,15 +98,22 @@ public: }; inline ssize_t cTBSocket::SysRead(void *Buffer, size_t Length) const { - if (m_Type == SOCK_DGRAM) { + if (m_Type == SOCK_STREAM) + return ::recv(*this, Buffer, Length, 0); + else { socklen_t len = sizeof(m_RemoteAddr); return ::recvfrom(*this, Buffer, Length, 0, (sockaddr*)&m_RemoteAddr, &len); - } else - return ::recv(*this, Buffer, Length, 0); + } } inline ssize_t cTBSocket::SysWrite(const void *Buffer, size_t Length) const { return ::send(*this, Buffer, Length, 0); + if (m_Type == SOCK_STREAM) + return ::send(*this, Buffer, Length, 0); + else { + socklen_t len = sizeof(m_RemoteAddr); + return ::sendto(*this, Buffer, Length, 0, (sockaddr*)&m_RemoteAddr, len); + } } #endif // TOOLBOX_SOCKET_H |