Bonjour,
je fais juste un POC, donc le code est minimal et moche. J'utilise le module network de la SFML pour envoyer des données depuis un serveur. Voici le code du serveur:
#include <string>
#include <iostream>
#include <SFML/Network/IpAddress.hpp>
#include <SFML/Network/TcpSocket.hpp>
#include <SFML/Network/TcpListener.hpp>
#include <SFML/Network/Packet.hpp>
#include <SFML/System/Mutex.hpp>
#include <SFML/system/Thread.hpp>
using namespace std;
bool quit = false;
string msg_to_send = "";
sf::Mutex global_mutex;
sf::TcpSocket socket;
int exit_error( const string & msg )
{
cout << "error: " << msg << endl;
getchar();
return 1;
}
void send_message()
{
while(!quit)
{
sf::Packet packet_send;
global_mutex.lock();
packet_send << msg_to_send;
global_mutex.unlock();
socket.send( packet_send );
std::string msg;
sf::Packet packet_receive;
}
}
void get_input()
{
std::string s;
std::cout << "\nEnter 'exit' to quit or message to send: ";
std::cin >> s;
if(s == "exit")
quit = true;
global_mutex.lock();
msg_to_send = s;
global_mutex.unlock();
}
int main()
{
sf::TcpListener listener;
listener.listen( 4567 );
listener.accept( socket );
std::cout << "New client connected: " << socket.getRemoteAddress() << std::endl;
sf::Thread thread( &send_message );
thread.launch();
while(!quit)
get_input();
cout << "end ok" << endl;
getchar();
return 0;
}
Le client reçoit bien les données, mais l'affichage du message reçu est des plus aléatoire. Parfois rien n'est affiché, parfois seulement des bribes (par exemple, j'envoie "test", et il m'affiche "tt" ). Le code du client:
#include <string>
#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>
using namespace std;
sf::TcpSocket socket;
bool quit = false;
sf::Text text;
sf::Mutex global_mutex;
bool connect()
{
if(socket.connect( sf::IpAddress::LocalHost, 4567 ) == sf::Socket::Done)
return true;
return false;
}
void receive()
{
while( !quit )
{
sf::Packet packet_receive;
socket.receive( packet_receive );
string msg;
if ( packet_receive >> msg )
if ( !msg.empty() )
{
global_mutex.lock();
text.setString( msg );
global_mutex.unlock();
}
}
}
int main()
{
sf::RenderWindow window(sf::VideoMode(600, 200), "SFML works!");
sf::Font my_font;
if ( !my_font.loadFromFile( "C:/Windows/Fonts/Arial.ttf" ) )
return 1;
text.setCharacterSize( 30 );
text.setColor( sf::Color::Green );
text.setPosition( 100, 100 );
text.setFont( my_font );
if ( !connect() )
return 2;
sf::Thread thread_listen( receive );
thread_listen.launch();
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
global_mutex.lock();
window.draw(text);
global_mutex.unlock();
window.display();
}
return 0;
}
Je pense que le problème vient de l'affectation de la chaine de caractère ( au niveau du text.SetString() ), c'est pour ça que je poste dans cette section du forum.
Voyez-vous ce qui cloche dans mon code?