Du bist nicht angemeldet.

Werbeanzeige

SilentDragon

Alter Hase

  • »SilentDragon« ist der Autor dieses Themas

Beiträge: 532

Wohnort: Köln

Beruf: Student

  • Private Nachricht senden

1

12.03.2011, 18:41

Sockets und Sfml -_-

Hallo zusammen,

wollte eben ein Projekt in Sfml und mit Sockets schreiben, stehe aber vor einem kleinem Problem.
Mein Spiel baut eine Socket verbindung mit einem Server auf und kann auch Nachrichten Schicken.
Will ich jetzt aber Nachrichten des Servers empfangen friert das Spiel ein -_-

hier der Code ausschnitt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Start game loop 
while (Game.IsOpened()) 
{ 
rc=recv(s,srvmsg,256,0); 
if(rc==0) 
{ 
printf("Server closed connection...\n"); 
} 
if(rc==SOCKET_ERROR) 
{ 
printf("Error: recv, error code: %d\n",WSAGetLastError()); 
} 
srvmsg[rc]='\0'; 
}


ohne den empfangs teil läufts prima und ich kann Nachrichten/Daten an den Server schicken...
Liegt es viel. daran das der Server nicht ständig Nachrichten schickt sondern, nur wenn es was neues gibt aber "rc=recv(s,srvmsg,256,0);" solange wartet bis was kommt ?!
wie könnte ich das Problem lösen ? ^^

thx im voraus,

SD
...

NachoMan

Community-Fossil

Beiträge: 3 905

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

12.03.2011, 18:46

das liegt daran dass der client auf die nachricht wartet und erst weiter läuft wenn die verbindung unterbrochen ist oder eine nachricht empfangen wurde.

http://www.sfml-dev.org/documentation/1.…_1SocketTCP.htm
stichwort Blocking.
eine alternative wäre ein netzwerkthread.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

SilentDragon

Alter Hase

  • »SilentDragon« ist der Autor dieses Themas

Beiträge: 532

Wohnort: Köln

Beruf: Student

  • Private Nachricht senden

3

12.03.2011, 19:39

hmm sfml-network macht bei mir nur probleme, bleibe lieber bei meinem eigenem Socket ^.^

habe online nach netzwerkthreads gesucht finde nichts richtiges :/
kennt wer ein gutes Tutorial oder Beispielcode ? ^^
wollte auch noch wissen wo man nachlesen kann welche Datei-Formate von SFML unterstützt werden? bei den SFML-Tutorials wird zwar erklärt wie man Bilder lädt, aber nicht welche Formate unterstützt werden ^^(glaube nicht das nur .tga geladen werden können oO)

danke im voraus,

SD
...

NachoMan

Community-Fossil

Beiträge: 3 905

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

12.03.2011, 19:47

ist halt ein thread der nur daten empfängt und die empfangen daten in eine schlange packt, wo der spielthread sich die daten jedes frame abholen kann. der thread kann natürlich auch events auslösen.

das mit den eigenem socket würd ich mir nochmal überlegen.^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

SilentDragon

Alter Hase

  • »SilentDragon« ist der Autor dieses Themas

Beiträge: 532

Wohnort: Köln

Beruf: Student

  • Private Nachricht senden

5

13.03.2011, 16:38

habs jetzt einfach so gelöst, dass der Client in jeder Schleife eine Anfrage an neue Daten an den Server sendet so gibts jedes mal sicher eine Antwort ^.^

bleibt nur noch übrig: Wo kann ich Nachlesen welche (Bild)formate von SFML unterstütz werden ? ich finde prima tutorials wie man Bilder lädt aber nicht welche Formate auser .tga unterstützt werden ^^
...

6

13.03.2011, 17:05

Schau mal hier .

Gruß
SaRu_

Nox

Supermoderator

Beiträge: 5 271

Beruf: Student

  • Private Nachricht senden

7

13.03.2011, 18:20

SilentDragon es gibt mind 3 Varianten die besser sind als deine:
1. non blocking
2. threading
3. select
Außerdem wenn du dich nicht mit den Netzwerkgemeinheiten bemühen willst, dann solltest du eine von den vielen verfügbaren Netzwerklibs nutzen. Z.B. kann ich als Einstieg irrnetlite/enet empfehlen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

TSM

Frischling

Beiträge: 30

Beruf: Schüler

  • Private Nachricht senden

8

07.06.2014, 08:44

Lösung: socket.setBlocking(false); :D

MitgliedXYZ

Alter Hase

Beiträge: 1 377

Wohnort: Bayern

  • Private Nachricht senden

9

07.06.2014, 11:28

@TSM
Was hast du den da ausgegraben?

Architekt

Community-Fossil

Beiträge: 2 496

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

10

07.06.2014, 11:37

Etwas wo sogar noch Saru_ aktiv war. :D
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige