#include "asio_service.h"
 
#include "threads/thread.h"
 
#include <atomic>
#include <iostream>
 
{
public:
    MulticastClient(const std::shared_ptr<CppServer::Asio::Service>& service, const std::string& address, const std::string& multicast, int port)
          _multicast(multicast)
    {
    }
 
    void DisconnectAndStop()
    {
        _stop = true;
            CppCommon::Thread::Yield();
    }
 
protected:
    {
        std::cout << 
"Multicast UDP client connected a new session with Id " << 
id() << std::endl;
 
        
 
        
    }
 
    {
        std::cout << 
"Multicast UDP client disconnected a session with Id " << 
id() << std::endl;
 
        
        CppCommon::Thread::Sleep(1000);
 
        
        if (!_stop)
    }
 
    void onReceived(
const asio::ip::udp::endpoint& endpoint, 
const void* buffer, 
size_t size)
 override 
    {
        std::cout << "Incoming: " << std::string((const char*)buffer, size) << std::endl;
 
        
    }
 
    void onError(
int error, 
const std::string& category, 
const std::string& message)
 override 
    {
        std::cout << "Multicast UDP client caught an error with code " << error << " and category '" << category << "': " << message << std::endl;
    }
 
private:
    std::atomic<bool> _stop{false};
    std::string _multicast;
};
 
int main(int argc, char** argv)
{
    
    std::string listen_address = "0.0.0.0";
    if (argc > 1)
        listen_address = argv[1];
 
    
    std::string multicast_address = "239.255.0.1";
    if (argc > 2)
        multicast_address = argv[2];
 
    
    int multicast_port = 3334;
    if (argc > 3)
        multicast_port = std::atoi(argv[3]);
 
    std::cout << "UDP listen address: " << listen_address << std::endl;
    std::cout << "UDP multicast address: " << multicast_address << std::endl;
    std::cout << "UDP multicast port: " << multicast_port << std::endl;
 
    std::cout << std::endl;
 
    
    auto service = std::make_shared<AsioService>();
 
    
    std::cout << "Asio service starting...";
    service->Start();
    std::cout << "Done!" << std::endl;
 
    
    auto client = std::make_shared<MulticastClient>(service, listen_address, multicast_address, multicast_port);
    client->SetupMulticast(true);
 
    
    std::cout << "Client connecting...";
    client->ConnectAsync();
    std::cout << "Done!" << std::endl;
 
    std::cout << "Press Enter to stop the client or '!' to reconnect the client..." << std::endl;
 
    
    std::string line;
    while (getline(std::cin, line))
    {
        if (line.empty())
            break;
 
        
        if (line == "!")
        {
            std::cout << "Client reconnecting...";
            client->IsConnected() ? client->ReconnectAsync() : client->ConnectAsync();
            std::cout << "Done!" << std::endl;
            continue;
        }
    }
 
    
    std::cout << "Client disconnecting...";
    client->DisconnectAndStop();
    std::cout << "Done!" << std::endl;
 
    
    std::cout << "Asio service stopping...";
    service->Stop();
    std::cout << "Done!" << std::endl;
 
    return 0;
}
virtual void onConnected()
Handle client connected notification.
const CppCommon::UUID & id() const noexcept
Get the client Id.
bool IsConnected() const noexcept
Is the client connected?
virtual void onDisconnected()
Handle client disconnected notification.
virtual void onError(int error, const std::string &category, const std::string &message)
Handle error notification.
virtual void JoinMulticastGroup(const std::string &address)
Join multicast group with a given address (synchronous)
virtual void ReceiveAsync()
Receive datagram from the server (asynchronous)
virtual void onReceived(const asio::ip::udp::endpoint &endpoint, const void *buffer, size_t size)
Handle datagram received notification.
virtual bool DisconnectAsync()
Disconnect the client (asynchronous)
virtual bool ConnectAsync()
Connect the client (asynchronous)