Problème UDP avec SDLnet! Au secours!

Fermé
globoeil Messages postés 5 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 3 décembre 2009 - 3 déc. 2009 à 13:23
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]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
};/code

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).

[u]Démarrage du serveur:/u
[code]
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;/code

[u]Démarage du client:/u
[code]
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;
/code

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] 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;/code

Réception de données:
[code] 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;/code

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 :)!