Bonjour à tous

J'essaye d'utiliser SDL_net (librairie extension de la SDL, pour le net).
J'ai un programme intégrant serveur et client.
Donc un client peut être serveur aussi.

Le programme est en 2 parties: Connexion en TCP pour échange d'IP,
puis l'envoi/réception de données tout le long se fait en UDP.
D'abord, le client se connecte à un serveur en TCP,
puis le serveur et le client démarrent les services UDP et ferment TCP.

J'utilise une petite structure pou simplifier tout ça:
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
struct Communication{
    //Une communication
    //2 parties:
    //Le client envoie quelque chose
    Uint16 outPortIn;//Le port pour recevoir une donnée en retour
    UDPsocket outSocketIn;//La socket pour recevoir une donnée en retour
    Uint16 outPortOut;//Le port pour envoyer des données
    UDPsocket outSocketOut;//La socket pour envoyer des données
    //Le serveur envoie quelque chose
    Uint16 inPortIn;//Le port pour recevoir des données
    UDPsocket inSocketIn;//La socket pour recevoir des données
    Uint16 inPortOut;//Le port pour envoyer des données en retour
    UDPsocket inSocketOut;//La socket pour envoyer des données en retour
 
    SDL_Thread* serverThread;//Thread pour le serveur pour communiquer avec le client
    Uint32 ip;//Ip client
};
Note: Ci-dessous, j est le port de départ utilisé, donc par exemple si j vaut 1, alors les ports 1,2,3 et 4 sent utilisés (en UDP).

Démarrage du serveur:
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
 
        IPaddress* ipaddress = SDLNet_TCP_GetPeerAddress(tempSocket);
        Uint32 ipp = ipaddress->host;
        SDLNet_TCP_Close(tempSocket);
 
        IPaddress srvadd;
        char ipe[16];
        sprintf(ipe,"%d.%d.%d.%d",ipp%256,(ipp/256)%256,(ipp/256/256)%256,ipp/256/256/256);
 
        //Création d'une communication
        communications[i] = new Communication;
        int j=port;
        communications[i]->inPortIn=j+2;
        SDLNet_ResolveHost(&srvadd,ipe,communications[i]->inPortIn);
        communications[i]->inPortIn = srvadd.port;
        communications[i]->inSocketIn = SDLNet_UDP_Open(j+2);
        if(communications[i]->inSocketIn == NULL) exit(15);
        communications[i]->inPortOut=j+3;
        SDLNet_ResolveHost(&srvadd,ipe,communications[i]->inPortOut);
        communications[i]->inPortOut = srvadd.port;
        communications[i]->inSocketOut = SDLNet_UDP_Open(j+3);
        if(communications[i]->inSocketOut == NULL) exit(15);
        communications[i]->outPortIn=j;
        SDLNet_ResolveHost(&srvadd,ipe,communications[i]->outPortIn);
        communications[i]->outPortIn = srvadd.port;
        communications[i]->outSocketIn = SDLNet_UDP_Open(j);
        if(communications[i]->outSocketIn == NULL) exit(15);
        communications[i]->outPortOut=j+1;
        SDLNet_ResolveHost(&srvadd,ipe,communications[i]->outPortOut);
        communications[i]->outPortOut = srvadd.port;
        communications[i]->outSocketOut = SDLNet_UDP_Open(j+1);
        if(communications[i]->outSocketOut == NULL) exit(15);
 
        communications[i]->ip = ipp;
Démarage du client:
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
 
    IPaddress* ipaddress = SDLNet_TCP_GetPeerAddress(tempSocket);
    SDLNet_TCP_Close(tempSocket);
 
        IPaddress srvadd;
        char ipe[16];
        communications[i] = new Communication;
        communications[i]->ip = ipaddress->host;
        sprintf(ipe,"%d.%d.%d.%d",communications[i]->ip%256,(communications[i]->ip/256)%256,(communications[i]->ip/256/256)%256,communications[i]->ip/256/256/256);
 
        communications[i]->inPortIn=j+1;
        SDLNet_ResolveHost(&srvadd,ipe,communications[i]->inPortIn);
        communications[i]->inPortIn = srvadd.port;
        communications[i]->inSocketIn = SDLNet_UDP_Open(j+1);
        communications[i]->inPortOut=j;
        SDLNet_ResolveHost(&srvadd,ipe,communications[i]->inPortOut);
        communications[i]->inPortOut = srvadd.port;
        communications[i]->inSocketOut = SDLNet_UDP_Open(j);
        if(communications[i]->inSocketOut == NULL) exit(15);
 
        communications[i]->outPortIn=j+3;
        SDLNet_ResolveHost(&srvadd,ipe,communications[i]->outPortIn);
        communications[i]->outPortIn = srvadd.port;
        communications[i]->outSocketIn = SDLNet_UDP_Open(j+3);
        if(communications[i]->outSocketIn == NULL) exit(15);
        communications[i]->outPortOut=j+2;
        SDLNet_ResolveHost(&srvadd,ipe,communications[i]->outPortOut);
        communications[i]->outPortOut = srvadd.port;
        communications[i]->outSocketOut = SDLNet_UDP_Open(j+2);
        if(communications[i]->outSocketOut == NULL) exit(15);
        communications[i]->ip = srvadd.host;
La partie TCP fonctionneparfaitement.
J'ai déjà pu échange quelques données en UDP avec d'autres programmes,
donc le problème ne vient pas du réseau.
Seule la partie UDP de ceprogramme pose problème:
Même si c'est bien le même port utilisé de chaque côté,
aucune donnée n'est jamais reçue!

Les fonctions:
Envoi de donnée:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
    UDPpacket* packet = SDLNet_AllocPacket(size);
    packet->address.host = communications[comm]->ip;
    if(sortant) packet->address.port =communications[comm]->outPortOut;
    else packet->address.port =communications[comm]->inPortOut;
    packet->channel = -1;
    packet->len = size;
    int i;
    if(sortant) i= SDLNet_UDP_Send(communications[comm]->outSocketOut,-1, packet);
    else i = SDLNet_UDP_Send(communications[comm]->outSocketIn,-1, packet);
    delete packet;
    return i;
Réception de données:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    UDPpacket* packet = SDLNet_AllocPacket(1024);
    packet->address.host = communications[comm]->ip;
    if(sortant) packet->address.port = communications[comm]->outPortIn;
    else packet->address.port = communications[comm]->inPortIn;
    packet->channel = -1;
    while(packet->len!=1){
        printf(".");
        //SDL_Delay(1);
         if(sortant) SDLNet_UDP_Recv(communications[comm]->outSocketIn, packet);
         else SDLNet_UDP_Recv(communications[comm]->inSocketIn, packet);
         }
    for(int i=0;i<packet->len;i++) buffer[i] = packet->data[i];
    delete packet;
    return packet->len;
Qu'est-ce que j'oublie ou que je fais mal avec le protocole UDP?
Je sais qu'il est possible d'utiliser BIND pour associer une socket à quelqu'un,
mais je sais aussi qu'il est possible de faire sans.
S'il vous plaît; aidez-moi!!
Merci pour toute aide que vous pourez apporter !