[C++] TCP & UDP

Simple Directmedia Layer: Portable Spieleprogrammierung
Antworten
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

[C++] TCP & UDP

Beitrag von Glocke » Fr Jan 04, 2013 10:58 am

Hi,

ich bastel an folgendem Problem bzgl. Server-Client:
  • Der Server nimmt einen Client über TCP an und schickt dann via UDP Daten an ihn.
  • Der Client baut zu einem Server über TCP eine Verbindung auf und erhält via UDP Daten von ihm.
Ich habe beide Skripte mal auf PasteBin hochgeladen:
server.cpp: http://pastebin.com/nvkKRP6n
client.cpp: http://pastebin.com/R4zLyD9S

Blöderweise meldet der Server, dass das Senden via UDP nicht geklappt hat. Ich arbeite an der Sache jetzt schon eine ganze Weile und komme nicht vorran. Sieht jemand, was ich falsch mache?

LG Glocke

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8485
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: [C++] TCP & UDP

Beitrag von Xin » Fr Jan 04, 2013 12:31 pm

Vorteilhafter wäre, wenn Du die Quellcodes in ein ZIP-Archiv mit Makefile packst. Dann kann man sie entpacken, kompilieren und vielleicht nachvollziehen, was das Problem ist.


Außerdem verstehe ich diese Zeile nicht:

Code: Alles auswählen

   p->data = (Uint8*)input;
Das wird aber vermutlich nicht das Problem sein.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: [C++] TCP & UDP

Beitrag von Glocke » Fr Jan 04, 2013 12:45 pm

Xin hat geschrieben:Vorteilhafter wäre, wenn Du die Quellcodes in ein ZIP-Archiv mit Makefile packst. Dann kann man sie entpacken, kompilieren und vielleicht nachvollziehen, was das Problem ist.
Das Posten von ZIP-Archiven hab ich mir abgewöhnt. Btw ist in den Dateien oben was zu bauen mit g++ drinne. Reicht das nicht? :)
Xin hat geschrieben:Außerdem verstehe ich diese Zeile nicht:

Code: Alles auswählen

   p->data = (Uint8*)input;
Das wird aber vermutlich nicht das Problem sein.
Ohne das kommt

Code: Alles auswählen

server.cpp: In Funktion »int main(int, char**)«:
server.cpp:55:19: Fehler: ungültige Umwandlung von »int« in »Uint8* {aka unsigned char*}« [-fpermissive]
Das data-Member eines UDP-Paketes ist laut Dokumentation vom Typ Uint8* - deswegen caste ich. Damit er weiß, was das mal war (bzgl. wie viele Bytes), bekommt er ja len gegeben.

LG Glocke

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8485
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: [C++] TCP & UDP

Beitrag von Xin » Fr Jan 04, 2013 3:40 pm

Glocke hat geschrieben:
Xin hat geschrieben:Vorteilhafter wäre, wenn Du die Quellcodes in ein ZIP-Archiv mit Makefile packst. Dann kann man sie entpacken, kompilieren und vielleicht nachvollziehen, was das Problem ist.
Das Posten von ZIP-Archiven hab ich mir abgewöhnt. Btw ist in den Dateien oben was zu bauen mit g++ drinne. Reicht das nicht? :)
Reichen schon, aber ZIP Archive mit Makefile gehen quasi immer, während ich bei mehr als einer Dateien erstmal keinen Bock habe, ein Projekt aufzuziehen. :-)

Schließlich muss ich erstmal rausfinden, welche Abhängigkeiten eventuell noch zu installieren sind usw. Sowas kann alles im ZIP-File beschrieben sein.
Glocke hat geschrieben:
Xin hat geschrieben:Außerdem verstehe ich diese Zeile nicht:

Code: Alles auswählen

   p->data = (Uint8*)input;
Das wird aber vermutlich nicht das Problem sein.
Ohne das kommt

Code: Alles auswählen

server.cpp: In Funktion »int main(int, char**)«:
server.cpp:55:19: Fehler: ungültige Umwandlung von »int« in »Uint8* {aka unsigned char*}« [-fpermissive]
Das data-Member eines UDP-Paketes ist laut Dokumentation vom Typ Uint8* - deswegen caste ich. Damit er weiß, was das mal war (bzgl. wie viele Bytes), bekommt er ja len gegeben.
Darf ich grob vermuten, dass hier kein Casting erwünscht ist, sondern - wie der Datentyp mit dem Stern vermuten lässt - eine Adresse, wo die Daten stehen?

Anders formuliert: CASTEN IST BÖSE!
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: [C++] TCP & UDP

Beitrag von Glocke » Sa Jan 05, 2013 11:58 am

Xin hat geschrieben:Reichen schon, aber ZIP Archive mit Makefile gehen quasi immer, während ich bei mehr als einer Dateien erstmal keinen Bock habe, ein Projekt aufzuziehen. :-)
Ich musste erstmal überlegen, was du mit "Projekt" meinst... ich hab zu lange nicht mehr mit einer IDE gearbeitet xD
Xin hat geschrieben:Schließlich muss ich erstmal rausfinden, welche Abhängigkeiten eventuell noch zu installieren sind usw.
Die Abhängigkeiten stehen auch oben im "Bash-Teil" des Quellcodes :P
Xin hat geschrieben:Darf ich grob vermuten, dass hier kein Casting erwünscht ist, sondern - wie der Datentyp mit dem Stern vermuten lässt - eine Adresse, wo die Daten stehen?
Ich hab jetzt mal eine Struktur verwendet als Information, die übertragen werden soll:

Code: Alles auswählen

struct Data {
    unsigned int id;
    long foo;
};
Server:

Code: Alles auswählen

    // ...
    bool running = true;
    unsigned int id = 0;
    Data* data = NULL;
    long tmp;
    while (running) {
        // Get Data
        data = new Data();
        std::cout << "foo=";
        std::cin >> tmp;
        data->id = id++;
        data->foo = tmp;
        // Make Packet
        p->data = (Uint8*)data;
        p->len = sizeof(Data);
        p->address.host = hisip->host;
        p->address.port = hisip->port;
        // Send
        std::cout << "Success: " << SDLNet_UDP_Send(udp, -1, p) << "\n";
        if (tmp == 0) {
            running = false;
        }
        delete data;
    }
    // ...
Client:

Code: Alles auswählen

    // ...
    bool running = true;
    Data* data = NULL;
    std::cout << "Waiting for data...\n";
    while (running) {
        if (SDLNet_UDP_Recv(udp, p)) {
            data = (Data*)(p->data);
            std::cout << "Incomming UDP Packet:\n"
                      << "\tChannel: " << p->channel << "\n"
                      << "\tData:    " << data->id << " | " << data->foo << "\n"
                      << "\tLen:     " << p->len << "\n"
                      << "\tMaxlen:  " << p->maxlen << "\n"
                      << "\tStatus:  " << p->status << "\n"
                      << "\tAddress: " << p->address.host << ":" << p->address.port << "\n";
            if (data->foo == 0) {
                running = false;
            }
            delete data;
        }
    }
    // ...
Beim Server wird nun "Success: 1" nach dem Senden angezeigt, der Client liest aber noch nix... :?

LG Glocke

/EDIT: Ich habe nun "hisip" nochmal via "SDLNet_ResolveHost(hisip, "localhost", 14000);" geändert (also die IP nochmal richtig geholt) - jetzt liest der Client.
Mein Problem ist aber, dass sich der Client auf dem Server via TCP anmelden soll und der Server dann via UDP an die Clients schickt.
Für jeden Client nochmal den alten Host resolven (beim Login) würde folgendes an "Mehraufwand" bedeuten ... kp ob das "normal" ist..

Code: Alles auswählen

    Uint32 number = SDLNet_Read32(&(hisip->host));
    int a, b, c, d;
    a = (number & 0xFF000000) >> 24;
    b = (number & 0x00FF0000) >> 16;
    c = (number & 0x0000FF00) >> 8;
    d = (number & 0x000000FF);
    char host[4] = {a, b, c, d};

    SDLNet_ResolveHost(hisip, host, 14000);
Danach geht es aber O_o

Ich hoffe ihr wisst was ich meine xDD

Antworten