aa
Hugo: SFML socket selector c++
Czy ktoś siedzi w tym? Chodzi mi o napisane prostego czatu, działa mi bez socket selector,
jednak chciałbym na bieżąco odświeżac czat. Gubie się w kodzie. Ktoś mógłby mi pomóc?
http://pastebin.com/XhZzHA2P <− kod działający bez socket selector
//surowy kod z socket selector
sf::TcpListener server; // gniazdo nasłuchujące
vector < sf::TcpSocket *> clients; // tutaj przechowujemy klientów
sf::SocketSelector sel; // selektor
sel.add( server ); // dodajemy gniazdo nasłuchujące
//...
while( true )
// pętla główna serwera
{
if( sel.wait( sf::seconds( 2 ) ) // jeśli metoda wait() zwróci true, to znaczy, że któreś z
dodanych gniazd jest gotowe do odbioru
// jako argument podajemy czas, przez który ma czekać na dane
{
if( sel.isReady( server ) ) // metoda isReady() sprawdza, czy dane gniazdo ma dane do
odebrania
// jeśli do motedy isReady() przekażemy gniazdo nasłuchujące, true oznacza, że ktoś
chce się do niego podłaczyć
{
TcpSocket * tmp = new sf::TcpSocket;
server.accept( * tmp ); // skoro ktoś chce się do nas połączyć, to go akceptujemy
clients.push
back( tmp ); // i dodajemy go do listy
sel.add( * tmp ); // oraz do selektora, żeby można było od niego odbierać dane
// nie zapomnij, by usunąć(za pomocą delete) gniazdo, kiedy się rozłączy
}
// pętla przechodząca po kontenerze gniazd (zależy od typu kontenera)
for( int i = 0; i < clients.size(); i++ ) // u nas to jest for i indeks i
{
if( sel.isReady( * clients[ i ] ) ) // *clients[i] coś nam wysłał
{
const int datasize = 100; // rozmiar danych do odebrania
char data[ datasize ]; // dane
unsigned int received; // odebrane
clients[ i ]−>receive( data, datasize, received );
cout << "Odebrano " << received << " bajtów od " << clients[ i
]−>getRemoteAddress() << endl;
// tutaj robimy coś z odebranymi dany
//...
}
}
//...
// reszta kodu serwera
}