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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| DWORD WINAPI HebergementPartie(void * thPartie) // Avec un thread on a un type void * (on peut mettre ce qu'on veut)
{
InfosPartie * PartieCree = thPartie; // On indique qu'on veut travailler sur une structure InfosPartie pour notre variable e/s
int CodeErreur; // Code d'erreur des fonctions
int ReponseConnexion;
int TailleStructure; // Taille de la structure serveur
char TexteErreur[120]; // Pour insérer le message d'erreur des socket dans la msgbox
int LongueurMessage; // Nombre de caracteres
char Tampon[65535]; // Tampon pour les données reçues ou envoyées
SOCKET idSocket; // Identifiant de la socket
SOCKADDR_IN InfosServeur, InfosClient; // Structure contenant les infos du serveur
idSocket = socket(AF_INET,SOCK_DGRAM,0); // On ouvre la socket en UDP
if (idSocket == INVALID_SOCKET)
{
sprintf(TexteErreur,"Impossible de creer la socket du à l'erreur : %d",WSAGetLastError());
MessageBox(NULL,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
return -1; // On termine la fonction et renvoi -1 pour prevenir l'appli principale
}
/* Config Infos Serveur */
InfosServeur.sin_family = AF_INET;
InfosServeur.sin_addr.s_addr = INADDR_ANY; // Ecoute sur toutes les IPs
InfosServeur.sin_port = htons(PORT_SERVICE_SERVEUR); // Ecoute sur le port 1337
/* ******************* */
CodeErreur = bind(idSocket,(struct sockaddr*)&InfosServeur,sizeof(InfosServeur)); // On bind la socket
if (CodeErreur != 0)
{
sprintf(TexteErreur,"Impossible d'écouter ce port du à l'erreur : %d",WSAGetLastError());
MessageBox(NULL,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
closesocket(idSocket);
return -1;
}
TailleStructure = sizeof(InfosServeur); // Taille de la structure car pointeur dans le recvfrom
while(1)
{
LongueurMessage = recvfrom(idSocket,Tampon,1515,0,(struct sockaddr*)&InfosClient,&TailleStructure);
if (LongueurMessage == SOCKET_ERROR)
{
sprintf(TexteErreur,"Impossible de recevoir les données du à l'erreur : %d",WSAGetLastError());
MessageBox(NULL,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
closesocket(idSocket);
return -1;
}
Tampon[LongueurMessage] = 0; // On rajoute \0 pour fermer la chaine
if(!strcmp(Tampon, "DECOUVERTE")) // On envoie la structure de la partie créée et on continue à écouter
{
LongueurMessage = sendto(idSocket, (char*)PartieCree, sizeof(InfosPartie),0,(struct sockaddr*)&InfosClient,TailleStructure);
if (LongueurMessage == SOCKET_ERROR)
{
sprintf(TexteErreur,"Impossible d'envoyer les données du à l'erreur : %d",WSAGetLastError());
MessageBox(NULL,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
closesocket(idSocket);
return -1;
}
}
else if(!strcmp(Tampon, "CONNEXION"))
{
sprintf(TexteErreur,"Le client avec l'IP %s a demandé à se connecter\nAccepter ?",inet_ntoa(InfosClient.sin_addr));
ReponseConnexion = MessageBox(NULL,TexteErreur,"Connexion entrante",MB_YESNO | MB_ICONQUESTION); // Messagebox avec oui/non sous forme de question
if (ReponseConnexion == 6) // Si on accepte le client (OUI vaut 6)
{
strcpy(Tampon,"CONNEXIONACCEPTEE"); // Copie la chaine de caractère dans buffer
LongueurMessage = sendto(idSocket,Tampon,strlen(Tampon),0,(struct sockaddr*)&InfosClient,sizeof(InfosClient)); // On envoie la sequence CONNACCEPT pour accepter la client
if (LongueurMessage == SOCKET_ERROR)
{
sprintf(TexteErreur,"Impossible d'envoyer les données du à l'erreur : %d",WSAGetLastError());
MessageBox(NULL,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
closesocket(idSocket);
return -1;
}
LongueurMessage = recvfrom(idSocket,Tampon,1515,0,(struct sockaddr*)&InfosClient,&TailleStructure); // On recoit le nom du joueur2 pour remplir la structure
if (LongueurMessage == SOCKET_ERROR)
{
sprintf(TexteErreur,"Impossible de recevoir les données du à l'erreur : %d",WSAGetLastError());
MessageBox(NULL,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
closesocket(idSocket);
return -1;
}
Tampon[LongueurMessage] = 0; // On rajoute \0 pour fermer la chaine
strcpy(PartieCree->PseudoJ2, Tampon); // On rempli la structure avec le pseudo du Joueur 2
strcpy(PartieCree->IPClient, inet_ntoa(InfosClient.sin_addr)); // SOn adresse IP ...
break; // ... On a toutes les infos, on arrete l'ecoute UDP et on passe en TCP pour la partie
}
else
{
strcpy(Tampon,"CONNEXIONREFUSEE"); // Copie la chaine de caractère dans buffer
LongueurMessage = sendto(idSocket,Tampon,strlen(Tampon),0,(struct sockaddr*)&InfosClient,sizeof(InfosClient)); // On envoie la sequence REFUSER pour refuser le client
if (LongueurMessage == SOCKET_ERROR)
{
sprintf(TexteErreur,"Impossible d'envoyer les données du à l'erreur : %d",WSAGetLastError());
MessageBox(NULL,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
closesocket(idSocket);
return -1;
}
}
}
}
CodeErreur = closesocket(idSocket); // On ferme la socket qui a été ouverte
if (CodeErreur != 0)
{
sprintf(TexteErreur,"Impossible de libérer la socket du à l'erreur : %d",WSAGetLastError());
MessageBox(NULL,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
return -1;
}
return 0; // Tout s'est bien passé
} |
Partager