14#include <osl/socket.hxx>
15#include <config_features.h>
30 typedef int socklen_t;
33 #include <sys/socket.h>
34 #include <netinet/in.h>
38 #include <osl/conditn.hxx>
40 #import <CoreFoundation/CoreFoundation.h>
52DiscoveryService::DiscoveryService()
85 hostname[1023] =
'\0';
86 gethostname(hostname, 1023);
98 mSocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
101 SAL_WARN(
"sd",
"DiscoveryService: socket failed: " << errno);
105 sockaddr_in aAddr = {};
106 aAddr.sin_family = AF_INET;
107 aAddr.sin_addr.s_addr =
htonl(INADDR_ANY);
110 int rc = bind(
mSocket,
reinterpret_cast<sockaddr*
>(&aAddr),
sizeof(sockaddr_in) );
114 SAL_WARN(
"sd",
"DiscoveryService: bind failed: " << errno);
118 struct ip_mreq multicastRequest;
120 multicastRequest.imr_multiaddr.s_addr =
htonl((239U << 24) | 1U);
121 multicastRequest.imr_interface.s_addr =
htonl(INADDR_ANY);
123 rc = setsockopt(
mSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP,
125 reinterpret_cast<const char*
>(&multicastRequest),
129 sizeof(multicastRequest));
133 SAL_WARN(
"sd",
"DiscoveryService: setsockopt failed: " << errno);
140 osl::Thread::setName(
"DiscoveryService");
149 socklen_t aLen =
sizeof( aAddr );
152 OString aString(
aBuffer, strlen(
"LOREMOTE_SEARCH" ) );
153 if ( aString ==
"LOREMOTE_SEARCH" )
155 OString aStringBuffer =
"LOREMOTE_ADVERTISE\n" +
158 if ( sendto(
mSocket, aStringBuffer.getStr(),
159 aStringBuffer.getLength(), 0,
reinterpret_cast<sockaddr*
>(&aAddr),
160 sizeof(aAddr) ) <= 0 )
#define PORT_DISCOVERY
The port used by LO's custom remote server discovery protocol.
virtual void SAL_CALL run() override
static DiscoveryService * spService
ZeroconfService * zService
virtual ~DiscoveryService() override
void setupSockets()
Networking related setup – must be run within our own thread to prevent the application blocking (fdo...
#define SAL_WARN(area, stream)
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
sal_uInt32 htonl(sal_uInt32 h)
sal_uInt16 htons(sal_uInt16 h)
std::unique_ptr< char[]> aBuffer