Autor Wątek: SDL_net UDP  (Przeczytany 1839 razy)

Offline Halajo

  • Użytkownik

# Sierpień 23, 2014, 10:34:06
Witam,
właśnie jestem w trakcie pisania małej gierki na WSOC 2014, a jako że ma być to gra multiplayer'owa to do połączenia używam SDL_net'a ( zaznaczę tutaj, że jestem kompletnym laikiem w programowaniu socketów itp. ) . No i tu pojawia się problem, gdyż nie mam pojęcia jak to ma w ogóle wyglądać. Chodzi o to, że widziałem jakieś proste przykłady chatów server-client, ale tylko dla jednego clienta co w wypadku 2 lub więcej? Na stronie SDL'a są przykłady lecz znajduję się tam tylko Multi TCP no i tu moje pytanie, czy podobnie tworzy się multi dla UDP? No i czy muszę stosować wielowątkowość lub czy jest to wskazane?
Próbowałem coś stworzyć na własną rękę lecz uważam, że jest to złe podejście mianowicie chodzi o to, że ze strony servera tworzyłem jeden socket do którego kilka clientów się podłączało i server w momencie otrzymania pakietu odsyłał swój pakiet na adres pakietu od clienta i  co najdziwniejsze ta metoda jakoś się sprawdza, tylko pytanie czy taka sytuacja jest poprawna( testowałem tylko po LANie), czy jednak trzeba tworzyć socketa dla każdego klienta?
Z góry dziękuje za odpowiedzi.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline timus

  • Użytkownik

  • +2
# Sierpień 23, 2014, 13:43:12
Moj kod serwera żywcem wycięty z Wolfenwar 3D:
#include <SDL2/SDL_net.h>

typedef struct s_player
{
  uint32_t ip;
  uint16_t port;

  ...
  /*Some other things like life or position*/
} s_Player_t;

UDPsocket sd;       // Socket descriptor
UDPpacket *p;       // Pointer to packet memory

vector_t * players;// I use my own vector implementation in c

char buffer[512];

void Send(IPaddress * ip, char * data, int len)
{
p->data = data;
p->len = len;

p->address.host = ip->host;
p->address.port = ip->port;

SDLNet_UDP_Send(sd, -1, p);
}

void SendToAll(char * data, int len)
{
for (unsigned int i = 0; i < players->count; i++)
{
s_Player_t * player = vector_get(players, i);
p->data = data;
p->len = len;

p->address.host = player->ip;
p->address.port = player->port;

SDLNet_UDP_Send(sd, -1, p);
}
}

int main(int argc, char **argv)
{
int quit;

// Initialize SDL_net
if (SDLNet_Init() < 0)
{
fprintf(stderr, "SDLNet_Init: %s\n", SDLNet_GetError());
exit(EXIT_FAILURE);
}

// Open a socket
if (!(sd = SDLNet_UDP_Open(2000)))
{
fprintf(stderr, "SDLNet_UDP_Open: %s\n", SDLNet_GetError());
exit(EXIT_FAILURE);
}

// Make space for the packet
if (!(p = SDLNet_AllocPacket(512)))
{
fprintf(stderr, "SDLNet_AllocPacket: %s\n", SDLNet_GetError());
exit(EXIT_FAILURE);
}

players = malloc(sizeof(vector_t));
vector_init_s(players, 20);

// Main loop
quit = 0;
while (!quit)
{
if (SDLNet_UDP_Recv(sd, p))
{
printf("UDP Packet incoming\n");
printf("\tChan:    %d\n", p->channel);
printf("\tData:    %s\n", (char *)p->data);
printf("\tLen:     %d\n", p->len);
printf("\tMaxlen:  %d\n", p->maxlen);
printf("\tStatus:  %d\n", p->status);
printf("\tAddress: %x %x\n", p->address.host, p->address.port);

if (p->data[0] == 0x01)// client ask for version
{
buffer[0] = 0x02;
buffer[1] = 0x00;//version, for now its 0
Send(&p->address, &buffer[0], 2);

}
...// Other commands respose here
}
}

// Clean and exit
SDLNet_FreePacket(p);
SDLNet_Quit();
return EXIT_SUCCESS;
}

Po stronie klienta kod wyglada bardzo podobnie dochodzi tylko SDLNet_ResolveHost i przy SDLNet_UDP_Open podaje 0.

Offline Halajo

  • Użytkownik

# Sierpień 23, 2014, 19:38:26
Super wielkie dzięki ;D