2016-03-20 20 views
3

Ağ programlamasında yeniyim. TCP soketleri ile biraz yaptım ve basit bir UDP istemcisinde/sunucusunda çalışıyorum.SDL_net UDP Paket veri

Bu proje için SDL_net çerçevesini kullanıyorum.

Çalıştığım sorun, UDPpacket yapısının veri için veri türü olarak Uint8 * kullanmasıdır. Ancak, sadece düz metin gönderebilmek istiyorum. Bir parça döküm okumuştum ama hiçbir şey uyumlu görünmüyor ve buna doğru çözümü bulmaya çalışıyorum.

İstemcinin kodu aşağıda gösterilmiştir. Hata, tahmin edeceğiniz gibi, p-data (kodun alt kısmına doğru) ayarlamaya çalıştığım zaman.

Sahip olduğunuz herhangi bir öneri veya düzeltme büyük önem taşıyor! Zaten SDLNet_AllocPacket tarafından tahsis edilmiş bir tampona

#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; 
} 

cevap

1

p->data noktaları - Eğer daha çok işaret nerede değiştirmeye çalışmak yerine, bunun içine dize veri kopyalamak gerekir. Bu nedenle, C string verisi ile paketi güncellediğiniz her yere benzer bir şey yapmak isteyeceksiniz:

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

Teşekkürler @Christopher, bunu çözdü! Arabellek zaten ayrılmış olduğunu farketmedim .... AllocPacket bana bu ipucu üzerinde olmalıydı rağmen * yüz hurma * istemci/sunucu şimdi çalışıyor – pocket86