Nowy wątek z odbieraniem socketow w osobnej funkcji nie działa

0

Stworzyłem prosty szablon, chciałbym prowadzić komunikator w sieci LAN. Głowny wątek programu ma wysyłać w konsoli cin(getline), drugi wątek w tle powinien w pętli odbierać wszystko w sieci client - serwer. Program piszczy, chodzi mu o socket. Jak to rozwiązać? Z góry dziękuję i pozdrawiam.

Error: error: request for member 'receive' in 'socket', which is of non-class type 'SOCKET(int, int, int) {aka unsigned int(int, int, int)}
kod:http://pastebin.com/qwvPs7D4

1

Tworzenie nowych wątków do blokujących operacji to rzadko dobry pomysł. Event loop i jakiś select czy coś.

W tym przypadku kompilator widzi wyłącznie funkcję o nazwie socket. Do funkcji func nie przekazałeś żadnego argumentu, nie ma ona też zmiennej lokalnej nazwanej socket.

0

Dziękuję za odpowiedź, zatem jak się do tego zabrać? próbowałem przez referencje to dać void func(TcpSocket &socket), sf::Thread thread(&func(socket)); ale także nie działa.
Gdzieś czytałem o Socket Selector, ale jak tego używać jeszcze nie wiem, trudne? Będzie wtedy działać? Chodzi o to by móc cały czas wysyłać i dostawać wiadomości, jak na gadu-gadu choćby. :)

0

SocketSelector brzmi jak to, czego powinieneś użyć. To nie jest trudne, tylko wymaga trochę innego spojrzenia na problem.

0

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
                //...
            }
        }
  • odbieranie wiadomości

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1