Problem z natychmiastowym odbieraniam wiadomości.

0

Dzień dobry, mam problem z czatem w SFML. Chodzi o to że if(Socket.receive(packet) == sf::Socket::Done){ blokuje mi cały program a jak dam tego if'a na sam dół fora to odbieram wiadomości tylko wtedy kiedy wyśle wiadomość. Co zrobić by ten if mi nie blokował for'a? BTW Jak dam else { break; } to nie odbiera wcale.

Cały for:

for(;;){
        
        if(content.empty()){ //Pisanie wiadmomości
            getline(cin, content);
            cout << "1" << endl;
        }
        
        if(!content.empty()){ //Wysyłanie
            cout << "2" << endl;
            wiado = Nick + ": " + content + ".";
            packet << wiado;
        
            if(Socket.send(packet) == sf::Socket::Done){
                packet.clear();
                content.clear();
            }
        }
        
        if(Socket.receive(packet) == sf::Socket::Done){ //Odbieranie wiadomości / niedziałający if
            packet >> wiado;
            packet.clear();
            cout << wiado << endl;
        }
        
    }
3

Wg dokumentacji metoda receive jest blokująca, więc będzie czekać w nieskończoność na pakiet, żaden else tu nie pomoże. Z tego co tam jest napisane można przestawić Socketa na nieblokującego i wtedy będzie zwrócone natychmiast sf::NotReady.

0

I jeszcze powinieneś użyć select - to znaczy jego odpowiednika dla biblioteki, której używasz.

https://www.sfml-dev.org/tutorials/2.5/network-socket.php#blocking-on-a-group-of-sockets

0
MarekR22 napisał(a):

I jeszcze powinieneś użyć select - to znaczy jego odpowiednika dla biblioteki, której używasz.

https://www.sfml-dev.org/tutorials/2.5/network-socket.php#blocking-on-a-group-of-sockets

Dlaczego? Chodzi o podzielenie, if odbiorę, else piszę?

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