View on GitHub

Asio Service Discovery

Components for service discovery via udp multicasting. It's using boost::asio for async networking. It's non-blocking and non-locking.

Download this project as a .zip file Download this project as a tar.gz file
Asio Service Discovery Documentation

![Build Status](https://travis-ci.org/beschulz/asio_service_discovery.svg?branch=master)

Components for service discovery via udp multicasting. It's using boost::asio for async networking. It's non-blocking and non-locking.

The best way to get started is having a [look at the tests](tests). Basic functionality is derived from boost::asios udp multicast example Read the API-Documentation

Note the max packet size for a udp packet is limited. This library supports whatever the maximum size for udp packets on the machine(s) it's running on is (~8kb on my machine). But keep that in mind, when choosing a service name. But anything below a kb will probably be allright. If you get a "Message to long" error, be sure, that you did not chose a ridiculously long service name.

requirements

  • asio_service_discovery is using boost::asio, therefore you need the boost asio headers and you need to link agains boost_system.
  • You also need a compiler that supports C++11
  • If you want to run the tests, you also need to install cmake

How it works

There are two components: service_announcer and service_discoverer.

The Announcer

The announcer multicasts information about the service it's announcing in one second intervals. The packet format is: service_name:computer_name:port You have to pass service_name and service_port to the service_announcer. they can be freely chosen.

The Discoverer

The discoverer listens for incomming multicast packets that match the service_name it was configured with. It hold a set of service_discoverer::service objects. Each time a packet comes in, it is parsed and if the service name matches, a service_discoverer::service objects is constructed and added to the set. After that the optional callback is called.

a simple example

The Announcer

``` boost::asio::io_service io_service; betabugs::networking::service_announcer announcer(io_service, "my_service", 1337); io_service.run(); ```

The Discoverer

``` boost::asio::io_service io_service; betabugs::networking::service_discoverer discoverer(io_service, "my_service", [](const service_discoverer::services& services){ std::clog << "my_service is available on the following machines:" << std::endl; for(const auto& service : services) { std::clog << " " << service << std::endl; } }); io_service.run(); ```

License

This library is Distributed under the Boost Software License, Version 1.0 .

Bugs

In case you find any bugs, please don't hesitate to contact me. Also pull-requests are highly apprechiated.

Platform support

The discovery should work on any platform, that is supported by boost::asio. It works like a charm on OSX and iOS. If you plan on using this on Linux, Android or Windows, please report you experience.