[SDL_net] TCP marche,mais impossiblede recevoir en udp!
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:
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:
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:
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:
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:
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 :)!