IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

le type du membre "data" de la structure "UDPpacket"


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Par défaut le type du membre "data" de la structure "UDPpacket"
    Bonjour,

    J'utilise sdl_net-1.2.8.
    J'ai un problème avec la structure "UDPpacket" [1] parce que le membre "data" est de type "Uint8*" alors que les données que je veux envoyer sur le réseau sont une structure... Donc je suis dans l'impossibilité de caster.

    Pourquoi ce n'est pas un type "void*" pour le membre "data" ?

    Merci.

    [1] http://jcatki.no-ip.org:8080/SDL_net/SDL_net.html#SEC52

    PS : en TCP le problème n'est pas présent puisqu'on a du "void*" http://jcatki.no-ip.org:8080/SDL_net/SDL_net.html#SEC23

  2. #2
    Membre confirmé Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Par défaut
    Ci-dessous il y a le code source qui fonctionne pour une chaine de caractères.
    Maintenant, ce que je veux c'est envoyer une structure à la place de la chaine de caractères.

    Par exemple, on peut prendre cette structure :
    data.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct data
    {
    	int integer;
    	char str[6];
    } data_t;
    Finalement, j'ai trouvé comment caster correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    data_t data;
    strcpy(data.str, "Hello\0");
    data.integer = 123;
    packet->data = (Uint8*)&data;
    packet->len = sizeof(data);
    Les données sont correctement envoyées et reçues entre le serveur et le client.

    Problème résolu.

    server.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #include <stdio.h> /* for printf */
    #include <stdlib.h> /* for exit */
    #include <SDL/SDL.h> /* for SDL_Init */
    #include <SDL/SDL_net.h> /* for SDLNet_Init */
    #include <unistd.h> /* for sleep */
    int main()
    {
    	// Initialize
    	if(SDL_Init(0) == -1)
    	{
    		printf("SDL_Init: %s\n", SDL_GetError());
    		exit(EXIT_FAILURE);
    	}
    	if(SDLNet_Init() == -1) {
    		printf("SDLNet_Init: %s\n", SDLNet_GetError());
    		exit(EXIT_FAILURE);
    	}
    	// Create the socket
    	UDPsocket udpsock = NULL;
    	udpsock = SDLNet_UDP_Open(6666);
    	if(udpsock == NULL)
    	{
    		printf("SDLNet_UDP_Open: %s\n", SDLNet_GetError());
    		exit(EXIT_FAILURE);
    	}
    	// Create the packet
    	UDPpacket *packet = NULL;
    	packet = SDLNet_AllocPacket(1024);
    	if(packet == NULL)
    	{
    		printf("SDLNet_AllocPacket: %s\n", SDLNet_GetError());
    		exit(EXIT_FAILURE);
    	}
    	// Receive the packet
    	int numrecv;
    	while(1)
    	{
    		numrecv = SDLNet_UDP_Recv(udpsock, packet);
    		printf("numrecv = %d (packet->data = \"%s\")\n", numrecv, (char *) packet->data);
    		sleep(1);
    	}
    	SDLNet_FreePacket(packet);
    	SDLNet_Quit();
    	SDL_Quit();
    	exit(EXIT_SUCCESS);
    }
    client.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include <stdio.h> /* for printf */
    #include <stdlib.h> /* for exit */
    #include <SDL/SDL.h> /* for SDL_Init */
    #include <SDL/SDL_net.h> /* for SDLNet_Init */
    #include <unistd.h> /* for sleep */
    int main()
    {
    	char data[6] = "Hello\0";
    	// Initialize
    	if(SDL_Init(0) == -1)
    	{
    		printf("SDL_Init: %s\n", SDL_GetError());
    		exit(EXIT_FAILURE);
    	}
    	if(SDLNet_Init() == -1) {
    		printf("SDLNet_Init: %s\n", SDLNet_GetError());
    		exit(EXIT_FAILURE);
    	}
    	// Create the socket
    	UDPsocket udpsock;
    	udpsock = SDLNet_UDP_Open(0);
    	if(!udpsock)
    	{
    		printf("SDLNet_UDP_Open: %s\n", SDLNet_GetError());
    		exit(1);
    	}
    	// Resolve host
    	IPaddress ipaddress;
    	if(SDLNet_ResolveHost(&ipaddress, "localhost", 6666) == -1)
    	{
    		printf("SDLNet_ResolveHost: %s\n", SDLNet_GetError());
    		exit(EXIT_FAILURE);
    	}
    	// Create the packet
    	UDPpacket *packet = NULL;
    	packet = SDLNet_AllocPacket(1024);
    	if(packet == NULL)
    	{
    		printf("SDLNet_AllocPacket: %s\n", SDLNet_GetError());
    		exit(EXIT_FAILURE);
    	}
    	packet->data = data;
    	packet->len = 6;
    	packet->address = ipaddress;
    	// Send the packet
    	int numsent;
    	while(1)
    	{
    		numsent = SDLNet_UDP_Send(udpsock, packet->channel, packet);
    		printf("numsent = %d (packet->data = \"%s\")\n", numsent, (char *)packet->data);
    		sleep(1);
    	}
    	SDLNet_FreePacket(packet);
    	SDLNet_Quit();
    	SDL_Quit();
    	exit(EXIT_SUCCESS);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/12/2009, 11h19
  2. Réponses: 2
    Dernier message: 11/05/2009, 20h18
  3. Réponses: 9
    Dernier message: 07/08/2008, 17h08
  4. Réponses: 1
    Dernier message: 28/05/2007, 09h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo