Problem z natychmiastowym odbieraniam wiadomości.

Problem z natychmiastowym odbieraniam wiadomości.
Wiktor Panecki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
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:

Kopiuj
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;
        }
        
    }
OG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 71
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::Socket::NotReady.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
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

Wiktor Panecki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
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ę?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.