Keine Ahnung von SFML und den dabei eingebauten Netzwerk Geschichten, aber wovon du redest sind blockierende Methoden. Das Verhalten hast du ja schon ganz gut erkannt. Sie warten bis etwas bestimmtes passiert. Bei Sockets ( so nennt sich normal die untere Schicht mit der du arbeitest wenn du Netzwerkapplikationen schreibst) gibt es verschiedene Möglichkeiten. Du kannst wie du schon selbst erkannt hast Threads benutzen. Dabei gehst du normalerweise so vor, dass du einen Thread hast in dem neue Clients angenommen werden, plus die Threads für die schon verbundenen Clients. Weiterhin kannst du mal nach Socket select suchen. Dadurch kannst du in einem Thread mehrere Verbindungen handeln. Musst du einfach ein wenig bei Google suchen. Ansonsten gibt es noch die Möglichkeit mit Asynchronen Sockets zu arbeiten. Dabei musst du Callback Funktionen angeben/registrieren, welche aufgerufen werden sobald ein bestimmtes Ereignis eintritt. In dieser Methode steht dann der Code der ausgeführt werden soll. Zum Beispiel würdest du hier eine Nachricht verarbeiten, sobald Daten ankommen. Danach kannst du auch mal suchen.
Das sind drei Möglichkeiten die du hast, wenn du direkt mit Sockets arbeiten möchtest. Nun gibt es einige Engines die dir diese ganze Arbeit abnehmen. Ist sicherlich mal ganz nett gesehen zu haben wie das grob abläuft. Eine fertige Engine nimmt dir halt einiges an arbeit ab.
Gucks dir vielleicht einfach mal an und spiel danach mit ein paar Engines rum. Dann hast du beides mal gesehen und kannst am besten entscheiden was du willst.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“