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
| DWORD WINAPI RechercherPartie(void * thParties) // Avec un thread on a un type void * (on peut mettre ce qu'on veut)
{
InfosPartie * Partie = thParties; // On indique qu'on veut travailler sur une structure InfosPartie pour notre variable e/s
/* Definition des variables */
int CodeErreur; // Code d'erreur des fonctions
char TexteErreur[120]; // Pour insérer le message d'erreur des socket dans la msgbox
int TailleStructure; // Taille de la structure serveur
int LongueurMessage; // Nombre de caracteres
int ValeurA1=1; // Necessaire pour le broadcast, doit etre envoyé sous forme d'adresse
int NumeroPartie=0;
int RetourConnexion;
char Tampon[30]; // Tampon pour les données reçues ou envoyées
SOCKET idSocket; // Identifiant de la socket
SOCKADDR_IN InfosServeur, MesInfos; // 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(fenetreRechercherPartie,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 + fonction broadcast */
InfosServeur.sin_family = AF_INET;
InfosServeur.sin_addr.s_addr = INADDR_BROADCAST; // On ne connait pas l'IP du serveur, alors on fait un broadcast
InfosServeur.sin_port = htons(PORT_SERVICE_SERVEUR); // Demande sur le port 1337
setsockopt(idSocket, SOL_SOCKET, SO_BROADCAST, (char*)&ValeurA1, 1); // Fonction necessaire en cas de broadcast
/* ***************************************** */
/* Config Infos Client */
MesInfos.sin_family = AF_INET;
MesInfos.sin_addr.s_addr = INADDR_ANY; // Ecoute sur toutes les IPs
MesInfos.sin_port = htons(PORT_SERVICE_CLIENT); // Demande sur le port 1337
/* ******************* */
CodeErreur = bind(idSocket,(struct sockaddr*)&MesInfos,sizeof(MesInfos)); // On bind la socket pour recevoir des donnees
if (CodeErreur != 0)
{
sprintf(TexteErreur,"Impossible d'écouter ce port du à l'erreur : %d",WSAGetLastError());
MessageBox(fenetreRechercherPartie,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
closesocket(idSocket);
return -1;
}
strcpy(Tampon,"DECOUVERTE"); // Copie la chaine de caractère dans buffer
LongueurMessage = sendto(idSocket,Tampon,strlen(Tampon),0,(struct sockaddr*)&InfosServeur,sizeof(InfosServeur)); // On envoie la sequence DECOUVERTE pour demander les infos des parties
if (LongueurMessage == SOCKET_ERROR)
{
sprintf(TexteErreur,"Impossible d'envoyer les données du à l'erreur : %d",WSAGetLastError());
MessageBox(fenetreRechercherPartie,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
closesocket(idSocket);
return -1;
}
TailleStructure = sizeof(MesInfos); // Taille de la structure
/* Configuration du timeout (fonction select();) */
fd_set PretARecevoir; // Variable pour savoir si le socket est pret a recv
struct timeval ConfigTemps; // Structure de config du timeout
int ValeurRetourSelect; // Valeur renvoyee par select
ConfigTemps.tv_sec = 5; // Timeout du select
/* ********************************************* */
while(1)
{
FD_ZERO(&PretARecevoir); // On met des zeros partout
FD_SET(idSocket, &PretARecevoir); // On associe l'id du socket
ValeurRetourSelect = select(idSocket + 1, &PretARecevoir, NULL, NULL, &ConfigTemps); // On teste le socket
if (ValeurRetourSelect > 0) // Reception de quelque chose avant timeout
{
LongueurMessage = recvfrom(idSocket, (char*)&Partie[NumeroPartie], sizeof(InfosPartie),0,(struct sockaddr*)&InfosServeur,&TailleStructure); // On recoit et on reboucle
if (LongueurMessage == SOCKET_ERROR)
{
sprintf(TexteErreur,"Impossible de recevoir les données du à l'erreur : %d",WSAGetLastError());
MessageBox(fenetreRechercherPartie,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
closesocket(idSocket);
return -1;
}
NumeroPartie++;
}
else if (ValeurRetourSelect == 0) // Le delai est expiré alors on sort de la boucle
{
break;
}
else // Erreur de configuration
{
MessageBox(fenetreRechercherPartie,"Erreur de la fonction select() !","Erreur Générale !",MB_OK | MB_ICONERROR);
closesocket(idSocket);
return -1;
}
}
[Fin .....] |
Partager