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:
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).
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 };
Démarrage du serveur:
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
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;
La partie TCP fonctionneparfaitement.
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;
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:
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 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;
Qu'est-ce que j'oublie ou que je fais mal avec le protocole UDP?
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;
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 !
Partager