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

AyJay

Frischling

  • »AyJay« ist der Autor dieses Themas

Beiträge: 67

Beruf: Schule, Hobbys :D

  • Private Nachricht senden

1

07.10.2011, 21:08

SFML und Multi-Client Sockets

Hey leute,
ich habe mich bei der SFML seite bischen rum geschaut bei denn tuts und habe versucht eine kommunikation zwischen client
und server zu machen aber so das der server empfangen und senden kann und der client genau so bloss, wie ?

Habe auch irgendwie gemerkt das man trotz des Selectors keine einzählnen Sockets einfach mal so wählen kann ?
Irgendwie begreife ich das nicht ganz vllt eine kleine erklärung wies richtig funktioniert ?

als anmerkung das ist ein GameServer so gesagt und soll jenachdem was er vom client bekommt an die bestimtmes zurücksenden oder an alle
für chat etc.

Server:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <SFML\Network.hpp>
#include <sstream>
#include <iostream>

template<class T> inline std::string toStr(T x){
    std::stringstream type;
    type << x;
    return type.str();
};

int main(){
    unsigned short Port = 2011;
    sf::SocketTCP Server;
    if (!Server.Listen(Port)){
        std::cout << "Can't listening to port " << Port << std::endl;
        system("pause");
        return EXIT_SUCCESS;
    }
    std::cout << "Listening to port " << Port << ", waiting for connections..." << std::endl;
    sf::SelectorTCP Selector;
    Selector.Add(Server);
    while (true){
        unsigned int NbSockets = Selector.Wait();
        for (unsigned int i = 0; i < NbSockets; ++i){
            sf::SocketTCP Socket = Selector.GetSocketReady(i);
            if (Socket == Server){
                sf::IPAddress Address;
                sf::SocketTCP Client;
                Server.Accept(Client, &Address);
                std::cout << "Client connected ! (" << Address << ")" << std::endl;
                Selector.Add(Client);

                std::string Message;
                Message = "Say anything..";
                sf::Packet Packet;
                Packet << Message;
                Client.Send(Packet);
            }else{
                sf::Packet Packet;
                if (Socket.Receive(Packet) == sf::Socket::Done){
                    std::string Message;
                    Packet >> Message;
                    std::cout << Message << std::endl;
                }else{
                    Selector.Remove(Socket);
                }
            }
        }
    }
    system("pause");
    return EXIT_SUCCESS;
}



Client(Läuft in einem Thread):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void NetworkClient(void* UserData){
    sf::SocketTCP Client;
    sf::IPAddress ServerAddress;
    ServerAddress = "127.0.0.1";
    unsigned short Port = 2011;
    std::cout << "Start Client" << std::endl;
    if(ServerAddress.IsValid()){
        std::cout << "Verbinde..." << std::endl;
        sf::Socket::Status State = Client.Connect(Port, ServerAddress,2.0f);
        if (State != sf::Socket::Done){
            std::cout << "Error while Connecting." << std::endl;
        }else{
            std::cout << "Connected!" << std::endl;
        }
        std::cout << "Empfange Daten..." << std::endl;
        bool Connected = true;
        while (Connected){
            char Message[128];
            std::size_t Received;
            if(Client.Receive(Message, sizeof(Message), Received) != sf::Socket::Done){
                std::cout << Message << std::endl;
            }
        }
        Client.Close();
    }else{
        std::cout << "IP-Address is not Valid" << std::endl;
    }
    std::cout << "Close Client" << std::endl;
}

C-/C++-Quelltext

1
2
3
While(!asleep){
    sheep++;
}

AyJay

Frischling

  • »AyJay« ist der Autor dieses Themas

Beiträge: 67

Beruf: Schule, Hobbys :D

  • Private Nachricht senden

2

13.10.2011, 18:41

Weiss das echt niemmand :S ? ~PUSH~

C-/C++-Quelltext

1
2
3
While(!asleep){
    sheep++;
}

3

13.10.2011, 23:28

Wann immer ein Client ein Paket an den Server sendet kannst du diesem speziellen Client mit Hilfe des Sockets, dass du zum empfangen des Paketes genutzt hast antworten. Willst du eine Nachricht an alle Clients weiterleiten musst du sie beim Server zwischenspeichern und sie allen Clients sobald sie sich melden zukommen lassen.

4

13.10.2011, 23:37

Für Spiele empfehle ich eh UDP, denn es macht da nichts aus, wenn mal ein Paket nicht ankommt ;)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

14.10.2011, 00:44

Kann man so nicht sagen;) Kommt immer drauf an was man senden will. Wenn der Server zum Beispiel einen Mapwechsel durchführen möchte, muss das bei allen ankommen. Genau wie ein Level, welches Übertragen wird. Oder wichtige Daten zum Spieler, oder oder oder.
„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.“

AyJay

Frischling

  • »AyJay« ist der Autor dieses Themas

Beiträge: 67

Beruf: Schule, Hobbys :D

  • Private Nachricht senden

6

14.10.2011, 20:23

Mir gehts ja eigendlich nur darum wie das richtig funktioniert am besten mit richtigen aufbau um ein benutzersystem zu integrieren und alles andere auch wie z.b positionen von spieler senden oder all denn kram halt soll aber auch alles am besten zu 99% ankommen :)

C-/C++-Quelltext

1
2
3
While(!asleep){
    sheep++;
}

7

14.10.2011, 21:36

Na, ich würd mich da an Schorsch halten. es kommt drauf an, welche Daten. Mapwechsel o.ä. müssen natürlich zuverlässig ankommen, aber wenn du zum Beispiel die Spielerpositionen alle 20ms sendest, und inter-/extrapolation benutzt, kann da auch mal was verloren gehen, ohne das es den Spieler umbringt, das ist mitunter einem größeren lag vorzuziehen. Musst du dir halt überlegen (und im zweifel testen!) welche daten du zuverlässig, aber dafür langsamer, welche schnell, aber dafür weniger zuverlässig sendest, usw., oder ob deine Datenmengen klein genug sein können, das du einfach alles über TCP schieben kannst, und es trotzdem noch schnell genug ist...

AyJay

Frischling

  • »AyJay« ist der Autor dieses Themas

Beiträge: 67

Beruf: Schule, Hobbys :D

  • Private Nachricht senden

8

14.10.2011, 22:32

Sheint mir als giebts große unterschiede zwischen UDP und TCP ?
Welche sind denn diese ?

C-/C++-Quelltext

1
2
3
While(!asleep){
    sheep++;
}

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

9

14.10.2011, 22:37

Bei TCP kommen alle gesendeten Packete in der richtigen Reihenfolge und garantiert an. (Also, solange die Verbindung besteht. Geht ein Packet verloren, wird es eben wieder geschickt...)
Bei UDP werden die Packete verschickt, es ist dem Sender aber egal ob die Packete ankommen oder nicht und in welcher Reihenfolge.
Das als sehr grobe Zusammenfassungen.

AyJay

Frischling

  • »AyJay« ist der Autor dieses Themas

Beiträge: 67

Beruf: Schule, Hobbys :D

  • Private Nachricht senden

10

14.10.2011, 22:40

Irgend eine andere Engine für UDP Sockets (Free)
wo eine beidseitige multiclient verbdinung möglich ist bei Sfml sheint es ja nicht so toll zu funktionieren

C-/C++-Quelltext

1
2
3
While(!asleep){
    sheep++;
}

Werbeanzeige