summaryrefslogtreecommitdiff
path: root/sd
diff options
context:
space:
mode:
authorAndrzej J.R. Hunt <andrzej@ahunt.org>2012-08-02 16:40:31 +0200
committerMichael Meeks <michael.meeks@suse.com>2012-08-06 10:23:09 +0100
commit473143eac756184028e487d23a9af6ea452e1324 (patch)
treed1f32b55a455974823e87cdb1c650133795a6f5d /sd
parent341f89ec308bd5a66a36741d22f100721d8223de (diff)
Multicast listening now working.
Change-Id: Icae91b26f1142d7f25d6e38af4f951be26d9b22a
Diffstat (limited to 'sd')
-rw-r--r--sd/source/ui/remotecontrol/DiscoveryService.cxx67
-rw-r--r--sd/source/ui/remotecontrol/DiscoveryService.hxx9
2 files changed, 52 insertions, 24 deletions
diff --git a/sd/source/ui/remotecontrol/DiscoveryService.cxx b/sd/source/ui/remotecontrol/DiscoveryService.cxx
index 2d2b3672079b..612332fac08e 100644
--- a/sd/source/ui/remotecontrol/DiscoveryService.cxx
+++ b/sd/source/ui/remotecontrol/DiscoveryService.cxx
@@ -15,6 +15,16 @@
#include "DiscoveryService.hxx"
+#ifdef WIN32
+ #include <winsock.h>
+ typedef int socklen_t;
+#else
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ #include <arpa/inet.h>
+#endif
+
using namespace osl;
using namespace rtl;
using namespace sd;
@@ -22,9 +32,25 @@ using namespace std;
DiscoveryService::DiscoveryService()
:
- Thread( "sd::DiscoveryService" ),
- mSocket()
+ Thread( "sd::DiscoveryService" )
+// mSocket()
{
+ mSocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
+
+ sockaddr_in aAddr;
+ aAddr.sin_family = AF_INET;
+ aAddr.sin_addr.s_addr = htonl(INADDR_ANY);
+ aAddr.sin_port = htons( PORT_DISCOVERY );
+
+ bind( mSocket, (sockaddr*) &aAddr, sizeof(sockaddr_in) );
+
+ struct ip_mreq multicastRequest;
+
+ multicastRequest.imr_multiaddr.s_addr = inet_addr( "239.0.0.1" );
+ multicastRequest.imr_interface.s_addr = htonl(INADDR_ANY);
+
+ setsockopt( mSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP,
+ &multicastRequest, sizeof(multicastRequest));
}
DiscoveryService::~DiscoveryService()
@@ -32,15 +58,15 @@ DiscoveryService::~DiscoveryService()
}
-void DiscoveryService::replyTo( SocketAddr& rAddr )
+void DiscoveryService::replyTo( sockaddr_in& rAddr )
{
- SocketAddr aLocalAddr;
- mSocket.getLocalAddr( aLocalAddr );
- OString aAddrString = OUStringToOString( aLocalAddr.getHostname(),
- RTL_TEXTENCODING_UTF8 );
- OStringBuffer aBuffer( "LOREMOTE_ADVERTISE\n" );
- aBuffer.append( aAddrString ).append( "\n" );
- mSocket.sendTo( rAddr, aBuffer.getStr(), aBuffer.getLength() );
+// SocketAddr aLocalAddr;
+// mSocket.getLocalAddr( aLocalAddr );
+// OString aAddrString = OUStringToOString( aLocalAddr.getHostname(),
+// RTL_TEXTENCODING_UTF8 );
+// OStringBuffer aBuffer( "LOREMOTE_ADVERTISE\n" );
+// aBuffer.append( aAddrString ).append( "\n" );
+// mSocket.sendTo( rAddr, aBuffer.getStr(), aBuffer.getLength() );
}
void DiscoveryService::execute()
@@ -50,24 +76,21 @@ void DiscoveryService::execute()
vector<char> aBuffer;
aRead = 0;
-
-
- SocketAddr aListenAddr( "239.0.0.1", PORT_DISCOVERY );
- mSocket.bind( aListenAddr );
-
- SocketAddr aAddr;
while ( true )
{
aBuffer.resize( aRead + 100 );
+ sockaddr_in aAddr;
+ socklen_t aLen = sizeof( aAddr );
fprintf( stderr, "DiscoveryService waiting for packet\n" );
- aRet = mSocket.recvFrom( &aBuffer[aRead], 100 );
+// aRet = mSocket.recvFrom( &aBuffer[aRead], 100 );
+ recvfrom( mSocket, &aBuffer[aRead], 100, 0, (sockaddr*) &aAddr, &aLen );
fprintf( stderr, "DiscoveryService received a packet.\n" );
- if ( aRet == 0 )
- {
- fprintf( stderr, "Socket returned 0\n" );
-// break; // I.e. transmission finished.
- }
+// if ( aRet == 0 )
+// {
+// fprintf( stderr, "Socket returned 0\n" );
+// // break; // I.e. transmission finished.
+// }
aRead += aRet;
vector<char>::iterator aIt;
while ( (aIt = find( aBuffer.begin(), aBuffer.end(), '\n' ))
diff --git a/sd/source/ui/remotecontrol/DiscoveryService.hxx b/sd/source/ui/remotecontrol/DiscoveryService.hxx
index aa4b349950db..94a276546f42 100644
--- a/sd/source/ui/remotecontrol/DiscoveryService.hxx
+++ b/sd/source/ui/remotecontrol/DiscoveryService.hxx
@@ -27,9 +27,13 @@ namespace css = ::com::sun::star;
#define CHARSET RTL_TEXTENCODING_UTF8
+struct sockaddr_in;
+
namespace sd
{
+
+
class DiscoveryService : public salhelper::Thread
{
public:
@@ -42,8 +46,9 @@ namespace sd
static DiscoveryService *spService;
void execute();
- osl::DatagramSocket mSocket;
- void replyTo( osl::SocketAddr& rAddr );
+// osl::DatagramSocket mSocket;
+ int mSocket;
+ void replyTo( sockaddr_in& rAddr );
};
}