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

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

1

29.10.2012, 08:48

SFML 2.0 & Network & Multiple Clients & Send/Receive

Hiho,


Ich hab grad wiedermal ein Problemchen...
Kann ich zwischen mehreren Clienten kommunizieren indem ich bei dem Clienten die TcpSocket static mache (also das es halt von überall her vom Projekt dieselbe verbindung braucht) und dann einfach über das TcpSocket immerwieder "send(packet)" aufrufe?
es klappt zwar im moment bei mir nicht, aber irgendwie denk ich das da n anderer bock drin is, nur wollt ich halt sichergehn wo ich genau den Fehler suchen sollte... ;)
Wenn ich connecte, dann funktioniert das auch wunderbar, also beide sehen einander und können connecten, aber dann das senden klappt nie..

mein Code bis jetzt:

Client:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
void Network::Send(string msg)
{

    sf::Packet packet;

    if (!msg.empty())
    {
        packet << msg;
        clientSocket.send(packet);
    }

}


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
void Server::Receive()
{

    sf::Packet packet;
    string msg;
    while (!quit)
    {
        if (!socketadress.empty())
        {

            for (int x = 0; x <= socketadress.size()-1; x++)
            {
                if (socketadress[x]->receive(packet))
                {
                    packet >> msg;
                    cout << msg;
                    if (!msg.empty()) Send(msg);
                }
            }

        }
    }

}


Danke fürs Antworten!
♥ SFML 2.0 Visual Express 2010 ♥

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

2

29.10.2012, 08:53

Kann ich zwischen mehreren Clienten kommunizieren indem ich bei dem Clienten die TcpSocket static mache (also das es halt von überall her vom Projekt dieselbe verbindung braucht) und dann einfach über das TcpSocket immerwieder "send(packet)" aufrufe?

Das funktioniert nur bei UDP, weil TCP eine Verbindung aufbaut und diese an das Socket gebunden ist.

Einen String übergibt man übrigens, wie jeder andere zusammengesetzter Datentyp als konstante Referenz.
Wieso schreibst du "x <= socketadress.size()-1" und nicht einfach "x < socketadress.size()"?
Gewöhn dir lieber präinkrement an, das ist intuitiver und manchmal auch schneller.
Das gehört zu den Grundlagen, die man nach 2 Wochen drauf haben sollte. Such dir lieber erstmal was einfacheres als Netzwerkprogrammierung und mach dich besser mit den C++ Grundlagen vertraut.
Das Entwickeln von Onlinegames gehört zu den schwierigsten Projekten in der Softwareentwicklung. Wenn du es nicht schaffst eine Verbindung mit mehreren Clients aufzubauen, ohne einen Thread in einem Forum zu eröffnen, dann bist du wohl noch nicht so weit.

edit: Das wichtigste hab ich natürlich vergessen. Das Schlüsselwort Static solltest du erstmal aus deinem Quellcode verbannen ;)
"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« (29.10.2012, 09:05)


Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

3

29.10.2012, 09:12

Kann ich zwischen mehreren Clienten kommunizieren indem ich bei dem Clienten die TcpSocket static mache (also das es halt von überall her vom Projekt dieselbe verbindung braucht) und dann einfach über das TcpSocket immerwieder "send(packet)" aufrufe?

Das funktioniert nur bei UDP, weil TCP eine Verbindung aufbaut und diese an das Socket gebunden ist.



Dann kann ich demnach das Socket nicht in eine Liste speichern und so weiterhin verwenden? geht die Verbindung da verloren?
♥ SFML 2.0 Visual Express 2010 ♥

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

29.10.2012, 09:24

Wieso sollte sie verloren gehen?
"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?

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

5

29.10.2012, 09:38

Naja weil ich in meinem Projekt meine Connections in eine Liste speicher und über die Liste versuch was zu senden, es aber nicht klappt...

aber da ich jetzt vermute das die Verbindung nicht gekappt wird (was eigentlich meine vermutung war warum es nicht klappen könnte..) wird der Fehler wo anders liegen... :/
♥ SFML 2.0 Visual Express 2010 ♥

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

6

29.10.2012, 10:30

Das komische an der Sache ist ja die, das ich einmal was senden kann aber danach bricht es ab...

serverseitig:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    sf::TcpListener Listener;
    Listener.listen(PORT);

    while (!quit)
    {
        sf::Packet send;
        string s="hi";

        if (User <= 3) 
        {
            sf::TcpSocket client;
            cout << "Waiting for connection.." << endl;
    
            Listener.accept(client);
            clients.push_back(&client);
            client.send(send); // Das funktioniert!!
        }
    }


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    while (!quit)
    {
        sf::Packet packet;
        string msg;
        
        if (!clients.empty())
        {
            for (iclients = clients.begin(); iclients != clients.end(); ++iclients)
            {
                sf::TcpSocket &clients = **iclients;
                if (clients.receive(packet) == sf::Socket::Done)
                {
                    packet >> msg;
                    cout << msg;
                    if (!msg.empty()) Send(msg);
                }

            }
        }
    }


clientseitig:

Hier funktioniert es:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
bool Network::Connect()
{
    if (clientSocket.connect(IP, 1234) == sf::Socket::Done)
    {
        sf::Packet packet;
        string s="hi";
        packet << s;
        clientSocket.send(packet); // das funktioniert!!
    }

    return bnetwork;
}



hier funktioniert es nicht mehr....

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void Network::Send(string msg)
{

    sf::Packet packet;
    msg = "hi";

    if (!msg.empty())
    {
        packet << msg;
        clientSocket.send(packet); // das funktioniert nicht!! :/
    }

}



Ich hab einfach das Gefühl das ich irgendwo die Verbindung verlier, aber ka warum und wo...

Meine Vermutung ist, da ich die letzte hier gepostete Funktion "Send()" von der Player Klasse her aufrufe (also da wo der Spieler sich bewegt) und ich da eben ein neues Objekt erstellt habe vom Network aber da ich "clientSocket" static gemacht habe, dachte ich eben das "clientSocket" immer die verbindung hält auch wenn das Objekt neu erstellt wird..
Ich hoffe man versteht auf was ich hinaus will... würd nur gern bestätigt haben ob meine oben genannte Vermutung stimmt oder nicht..

Danke!
♥ SFML 2.0 Visual Express 2010 ♥

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

7

29.10.2012, 10:59

Da fehlen eindeutig Grundlagen. Der Socket wird in Zeile 17 zerstört. Du verwendest danach einen ungültigen Zeiger.
"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?

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

8

29.10.2012, 11:19

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    sf::TcpListener Listener;
    Listener.listen(PORT);

    while (!quit)
    {
        sf::Packet send;
        string s="hi";
        send << s;

        if (User <= 3) 
        {
            sf::TcpSocket *client = new sf::TcpSocket;
            Listener.accept(*client);
            clients.push_back(client);
            client->send(send);
        }
    }



Sooo gehts, yeah!

Thx!
♥ SFML 2.0 Visual Express 2010 ♥

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

9

29.10.2012, 13:28

Na dann lass das mal ein wenig laufen... du hast da ein schönes Speicherleck

Werbeanzeige