Czytałem teraz sporo o socket selector, jest to trywialne dla mnie.
http://pastebin.com/XhZzHA2P <- kod działający bez socket selector, czat
sf::TcpListener server
vector < sf::TcpSocket *> clients; // tutaj przechowujemy klientów
sf::SocketSelector sel; // selektor
sel.add( server ); // dodajemy gniazdo nasłuchujące
Z tego co czytałem musimy zainicjować vektor klientów i dodać go do serwera, który będzie nasłuchiwać
if( sel.wait( sf::seconds( 2 ) )
- sprawdza czy jest jakiś ruch przez gniazdo
if( sel.isReady( server ) )
- sprawdza czy są jakieś dane do odbioru
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 );
- umozliwiamy dodanie klienta
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
//...
}
}
Pytania:
1.To są wytyczne do serwera; co z klientem? Klient też będzie nasłuchiwać; a w konsekwencji co z wysyłaniem przez serwer wiadomości?
2. Czy w tym kodzie będzie co wiadomość dodawać nam tego samego klienta? i w forze będzie sie nam on mnożył?
Bardzo bym prosił o pomoc w dogłębnym zrozumieniu, a jak ktoś by miał Wielkie Serce to był bym niezwykle wdzięczny o większy lub mniejszy fragment kodu.