Bonjour bonjour, j'ai (encore et toujours) des probl�mes avec Asio
Je m'explique : j'ai lu et me suis inspir� de l'article de Pierre Schwartz (http://khayyam.developpez.com/articl.../architecture/), et je suis en train de r�aliser un jeu comportant un serveur, qui ne fait que �a (et non, comme dans l'article, un client qui joue aussi le r�le de serveur), et des clients qui s'y connectent. Autant pour le serveur que pour le client, j'utilise ceci pour mettre en place l'�coute sur le socket TCP, en ayant v�rifi� que le socket soit bien connect� avant :
Ensuite, ma fonction tcpAsyncReceive :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3 m_tcpSocket->async_receive(asio::buffer(m_networkBuffer), boost::bind(&NetworkMachine::tcpAsyncReceive, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); asio::thread(boost::bind(&asio::io_service::run, &m_io));
J'ai bien d'affich� "tcpAsyncReceive size : 0", 0 erreurs une premi�re fois � l'�tablissement de la connexion, puis... Plus rien, alors que le client continue d'�mettre des donn�es, et que le socket n'est pas ferm� (Ce que je sais pour la simple et bonne raison que si je quitte le serveur, le client me dit qu'il est d�connect�, mais pas avant).
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 void NetworkMachine::tcpAsyncReceive(const asio::error_code& pE, size_t pBytesReceived) { std::cout << "tcpAsyncReceive size : " << m_networkBuffer.size() << std::endl; std::cout << "pE.value() : " << pE.value() << std::endl; if (pE.value() != 0) { EngineEvent e; e.m_type = EngineEvent::REMOVE_MACHINE; e.m_iData["ID"] = m_id; m_parent->pushReceivedEvent(e); return; } // let's deserialize the message if (m_networkBuffer.size() > 0) { std::string strData(&m_networkBuffer[0], m_networkBuffer.size()); std::istringstream archiveStream(strData); boost::archive::text_iarchive archive(archiveStream); EngineEvent ne; archive >> ne; // add the event to the received event queue m_parent->pushReceivedEvent(ne); std::cout << "Something received from " << getNick() << " and added to NetworkEngine received queue." << std::endl; } return; }
Ma question est donc, ai-je oubli� quelque chose ? Faut-il remettre en place l'�coute apr�s que la fonction ait �t� appell�e une fois ?
Merci.
Partager