2016-03-20 7 views
3

Ich bin neu in der Netzwerkprogrammierung. Ich habe ein bisschen mit TCP-Sockets gemacht, und ich versuche es mit einem einfachen UDP-Client (s)/Server.SDL_net UDP Paketdaten

Ich bin mit dem SDL_net Rahmen für dieses Projekt.

Das Problem, das ich in renne ist der UDPpacket struct Uint8 * als Datentyp für die Daten verwendet. Ich möchte jedoch nur einen direkten Text senden können. Ich habe ein wenig über Casting gelesen, aber nichts scheint kompatibel zu sein, und ich habe Mühe, die richtige Lösung dafür zu finden.

Der Code für den Client wird unten angezeigt. Der Fehler ist, wie Sie annehmen würden, wenn ich versuche, p-Daten (am Ende des Codes) zu setzen.

Ratschläge oder Korrekturen, die Sie würde haben sehr zu schätzen!

#include <iostream> 
#include <stdio.h> 
#include <SDL2/SDL.h> 
#include <SDL2_net/SDL_net.h> 

using namespace std; 


int main(int argc, const char * argv[]) { 

    UDPsocket sd; 

    //create the socket 
    if(!(sd = SDLNet_UDP_Open(0))) { 
     printf("Could not create socket\n"); 
     SDLNet_Quit(); 
     SDL_Quit(); 
     exit(1); 
    } 

    //get my address 
    IPaddress* myaddress = SDLNet_UDP_GetPeerAddress(sd, -1); 
    if(!myaddress) { 
     printf("Could not get own port\n"); 
     exit(2); 
    } 

    cout << "My Port: " << myaddress->port << endl; 


    /****************************** 
    * These are used to recieve 
    *******************************/ 

    UDPpacket * rcvP = SDLNet_AllocPacket(1024); 
    if(!rcvP) { 
     printf("Could not allocate receiving packet\n"); 
     exit(3); 
    } 

    UDPsocket rcvS; 
    rcvS = SDLNet_UDP_Open(myaddress->port); 
    if(!rcvS) 
    { 
     printf("Could not allocate receiving socket\n"); 
     exit(4); 
    } 

    //resolve the address of the server 
    IPaddress srvHost; 
    IPaddress * ip = & srvHost; 
    SDLNet_ResolveHost(ip, "localhost", 8888); 

    //set up the packet 
    UDPpacket * p = SDLNet_AllocPacket(1024); 
    if(!p) { 
     printf("Could not allocate packet\n"); 
     SDLNet_Quit(); 
     SDL_Quit(); 
     exit(2); 
    } 

    //link the server address to our packet 
    p->address.host = srvHost.host; 
    p->address.port = srvHost.port; 


    //main loop 
    while(true){ 

     SDL_Event e; 
     while(SDL_PollEvent(&e)) 
     { 
      if(e.type == SDL_KEYDOWN) 
      { 
       char * data; 
       switch(e.key.keysym.sym) 
       { 
        case SDLK_LEFT: 
         p->data = "left"; 
         p->len = strlen("left") + 1; 
         SDLNet_UDP_Send(sd, -1, p); 
         break; 
        case SDLK_RIGHT: 
         p->data = "right"; 
         p->len = strlen("right") + 1; 
         SDLNet_UDP_Send(sd, -1, p); 
         break; 
        default: 
         break; 
       } 
      } 
     } 

    } 

     return 0; 
} 

Antwort

1

p->data zeigt auf einen Puffer, der bereits von SDLNet_AllocPacket zugewiesen wurde - müssen Sie Ihre String-Daten in sie kopieren, anstatt zu versuchen, zu ersetzen, wo es Punkte. Also, Sie werden etwas Ähnliches tun müssen, wo immer Sie das Paket mit C-String-Daten aktualisieren:

{ 
    static const char* data = "left"; 
    p->len = strlen(data) + 1; 
    memcpy(p->data, data, p->len); 
} 
+0

Danke @Christopher, das hat es gelöst! Ich habe nicht bemerkt, dass der Puffer bereits zugeteilt war .... obwohl AllocPacket mich auf diesem * Face-Palm * Client/Server eingeweiht haben sollte, arbeiten jetzt – pocket86