Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

27.11.2012, 19:04

C++ - WinSock - Multiplayer - Datenübertragung per TCP - Verständnisprobleme

Abend Community!
Ich versuche gerade eine Datenübertragung per TCP für einen kleinen Multiplayer zu realisieren.

Mein Ansatz:
-----------------
Server:
Hauptthread -> Akzeptiert Verbindungen und stellt jeder einen eigenen Thread zu verfügen, wo dann der Datenaustausch behandelt wird
Client:
Hauptthread -> Erstellt eine Verbindung zum Server und erstellt dann einen Thread für die Kommunikation, außerdem rendert er alles Graphische(openGL) etc.


Bisherigen Probleme:
-------------------------
Die Zeichenketten wurden teilweise "aufgefressen", d.h. sie kamen fast nie komplett an.
Manchmal disconnected der Client, sofort nachdem er connected.


Meine Fragen:
----------------
Client:
Soll ich jedes mal, wenn die Schleife, in der das Rendern zustande kommt eine Nachricht losschicken oder wäre das zu oft?
Allgemeines:
Wie könnte ich am besten den Versand von den Daten regeln(stringstream<<floats), eine riesen Zeichenkette schicken oder "selbsthändig" zerstückeln?

Ich freue mich über alle Antworten!

denniro
Only God can judge me.

Flutschi

Treue Seele

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

2

27.11.2012, 19:18

Machst du es mit den Network und Threads dingern von SFML?

Weil ich bin grad an etwas ähnlichem dran, und frage mich auch wie ich es am besten anstellen soll, wer was wie wo verwaltet und wer wie wo was wie schnell schicken soll :D
♥ SFML 2.0 Visual Express 2010 ♥

3

27.11.2012, 19:22

Machst du es mit den Network und Threads dingern von SFML?

Weil ich bin grad an etwas ähnlichem dran, und frage mich auch wie ich es am besten anstellen soll, wer was wie wo verwaltet und wer wie wo was wie schnell schicken soll :D


Ne ich machs mit WinSock und der WinApi :D
Ich hoffe, dass uns beiden jemand helfen kann. Haha :)
Only God can judge me.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

27.11.2012, 19:25

Nein, er verwendet WinSock, sonst hätte er nicht solche Probleme mit "zerstückelten Nachrichten". Wenn du schon die SFML nutzt, wieso dann nicht auch sf::Network?

Im Grunde werden vorallem die Eingaben verschickt und jeder Client und Server hat seine eigene Instanz vom Spiel, die alle Berechnungen dazu durchführt.
Hin und wieder muss man natürlich Prüfen ob alles noch Synchron ist und wenn nicht etwas dagegen unternehmen. Das ist aber zum Testen garnicht so wichtig.

Ich sitze selbst an einem Onlinegame und spreche aus Erfahrung, wenn ich sage, dass es extrem schwierig ist(selbst nach ca. 5 Jahren Erfahrung).

@Denniro: Wenn ich mir dein Profil so anschaue... Du hast 248 Beiträge und keinen einzigen Post in einem Thread, der von einem anderen erstellt wurde. Sicher, dass du ein Hobby haben willst, das darin besteht Probleme zu lösen, wenn du solche großen Probleme damit hast?
"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?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (27.11.2012, 19:30)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

27.11.2012, 19:34

Ich vermute mal, dass du dem, unter Anfängern weit verbreiteten, Irrtum unterliegst, dass zu jedem send() genau ein entsprechendes recv() kommt. Das ist nicht der Fall, so funktioniert TCP nicht. Du wirst recv() in einer Schleife aufrufen müssen...

Flutschi

Treue Seele

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

6

27.11.2012, 19:42

Jo also mit sf::Network hast du wirklich alles schön einfach für dich für zum Connecten und Senden / Empfangen, also da hatte ich bis jetzt überhaupt keine Probleme (ausser ich hab sie selber verursacht :D ) , von daher würd ich auch auf das zurückgreifen, wenn du schon eh mit SFML arbeitest...
♥ SFML 2.0 Visual Express 2010 ♥

7

27.11.2012, 19:54

@Nachoman
Würde ich nicht darauf bestehen, würde ich auch meine Fragen hier nicht regelmäßig stellen.

@dot
recv() wird bereits in einer schleife aufgerufen

@Flutschi
Ich benutze aber die SFML nicht ;)
Only God can judge me.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

27.11.2012, 19:58

Zeig uns doch mal den relevanten Code und was genau schiefläuft. Ansonsten können wir wie immer nur spekulieren...

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

9

27.11.2012, 19:59

@Nachoman
Würde ich nicht darauf bestehen, würde ich auch meine Fragen hier nicht regelmäßig stellen.

Worauf sollst du bestehen? ?(
"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?

10

27.11.2012, 20:09

@Nachoman Ich bestehe darauf weiter zu programmieren, ist mir egal was du denkst.

@dot Hier der Code, der die Nachricht empfängt
Ich habe es momentan so, dass wenn ich eine Nachricht versende, der Doppelpunkt als Enderkennung gelten soll.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool net::receiveMessage(unsigned int size, char* buffer, SOCKET socket)
{
    std::stringstream msg;
    ZeroMemory(buffer, size);

    do{
        if(recv(socket, buffer, size, NULL) == SOCKET_ERROR)
            return false;
        msg << buffer;
    }while(msg.str()[msg.str().size()-1] != ':');

    strcpy_s(buffer, msg.str().size(), msg.str().c_str());
    return true;
}
Only God can judge me.

Werbeanzeige