boost::asio::udp mehrere clients



  • Hallo zusammen,

    ich habe ein paar Fragen zu boost::asio (im Speziellen die Verwendung von UDP):

    1.Wenn ich mehrere boost::asio::udp::socket.async_send_to aufrufe mache, wird dann bei io_service.run() / io_service.poll()
    auch mehrfach der completion-handler aufgerufen, oder nur einmal, undzwar sobald beide operationen fertig sind?

    2. Wie setzt man am besten die kommunikation mit mehreren clients um?

    Beim async_receive_from kann man ein endpoint übergeben, in den so wie ich das verstanden habe dann nach dem empfangen informationen über den sender drinstehen.

    Ist es dann sinnvoll, eine std::map<boost::asio::udp::endpoint, Player> zu haben und nach jedem empfangen damit zuzuordnen, oder gibt es da bessere möglichkeiten?

    3. Erstmal keine wirklich konkrete Frage, weil ich mich damit noch nicht so stark beschäftigt habe:
    Ist es sinnvoll multicast zu verwenden und wie funktioniert das?
    Was das allgemein ist werd ich mal auf wiki&co nachlesen.
    Zur Verwendung mit boost::asio habe ich dazu bisher nur ein Beispiel auf der boost::asio seite gefunden, aber keinen guten erklärenden text, sodass ich die verwendung noch nicht wirklich verstanden habe.
    Wichtiger sind aber 1 und 2.

    Ich hoffe ihr könnt mir helfen!
    Vielen Dank schonmal für eure Antworten.

    P.S.: Ich hab das in das Forum hier geschrieben und nicht in Webzeugs, weil in der Kategorie stand, dass boost hier reingehört.



  • 1.Wenn ich mehrere boost::asio::udp::socket.async_send_to aufrufe mache, wird dann bei io_service.run() / io_service.poll()
    auch mehrfach der completion-handler aufgerufen, oder nur einmal, undzwar sobald beide operationen fertig sind?

    Pro async_** Aufruf wird ein Completion Handler aufgerufen.



  • Danke!
    Das vereinfacht schonmal einiges.
    Ich hab jetzt erstmal auf multicast verzichtet.
    Zur Behandlung von mehreren clients habe ich gerade das hier geschrieben (noch nicht getestet):

    //in der game klasse:
    typedef std::map<boost::asio::ip::udp::endpoint, Player*> PlayerMap;
    PlayerMap myPlayerMap;
    boost::asio::ip::udp::endpoint myRemoteEndpoint;
    boost::array<char, 3000> myReadBuffer;
    ...
    
    void Game::onReadFinished(const boost::system::error_code& ec,
        std::size_t bytesTransferred)
    {
    	if (ec)
    	{
    		cerr << "error code " << ec.value() <<": " << ec.message() << endl;
    		//throw boost::system::system_error(ec);
    	}
    	sf::Packet packet;
    	packet.Append(myReadBuffer.data(), bytesTransferred);
    	if(myIsServer)
    	{
    		Player * client = 0;
    		PlayerMap::iterator itr = myPlayerMap.find(myRemoteEndpoint);
    		if(itr == myPlayerMap.end())
    		{
    			cout << "a new player joined!" << std::endl;
    			myPlayers.push_back(Player(-1, -1, 0.2f, 0.2f, 0.35f, 0.35f));
    			myPlayerMap[myRemoteEndpoint] = & myPlayers.back();
    			client = & myPlayers.back();
    		}
    		else
    		{
    			client = itr->second;
    		}
    		onReceivedClientInput(packet, *client);
    	}
    	else
    	{
    		onReceivedGameState(packet);
    	}
    	mySocket->async_receive_from(buffer(myReadBuffer), myRemoteEndpoint, 0, boost::bind(&Game::onReadFinished,
    		 this, boost::asio::placeholders::error,
    	     boost::asio::placeholders::bytes_transferred));
    }
    

    Geht das vll noch besser/einfacher?
    Oder hat sonst noch jemand Vorschläge?
    Ich werd mich nochmal melden, wenn ichs getestet hab.



  • Mir fällt gerade auf, dass ich adressen von elementen des vektors benutze, was afaik sehr böse ist, ich muss den vektor dann wohl auf pointer auf player umstellen, oder?



  • Gast1337 schrieb:

    Mir fällt gerade auf, dass ich adressen von elementen des vektors benutze, was afaik sehr böse ist, ich muss den vektor dann wohl auf pointer auf player umstellen, oder?

    Ja, auch boost::ptr_vector bietet sich evtl an.


Anmelden zum Antworten