Problem z natychmiastowym odbieraniam wiadomości.

Problem z natychmiastowym odbieraniam wiadomości.
Wiktor Panecki
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 3 lata
  • 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;
        }
        
    }
edytowany 3x, ostatnio: Wiktor Panecki
OG
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 4 lata
  • 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
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:minuta
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


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22
Wiktor Panecki
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 3 lata
  • 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ę?

edytowany 1x, ostatnio: Wiktor Panecki

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.