Bonjour à tous,

je ne sais pas si mon titre est bien approprié à ce dont je vais vous parler mais je ne savais pas vraiment comment l'exprimer.

Enfin, voilà je dois réaliser un jeu en client-serveur en utilisant l'api windows en c. j'ai choisi de faire un puissance 4 (pour l'instant en console) mais j'ai quelques soucis et difficultés de compréhension, je suis vraiment paumé .

j'ai donc un serveur qui accepte en boucle des clients et qui pour chaque, crée une thread. Chaque thread nouvellement crée "reçoit" une premier menu qui lui demande entre autres de se connecter. Lorsque le client veut se connecter, la thread fait appelle à une fonction dans laquelle je fais passée une structure Client qui contient le Socket, le pseudo(pour l'instant vide) et l'ip de celui-ci.
Donc dans cette fonction connexion(Client *cl), je demande d'entrée un pseudo et je vérifier s'il est bien présent dans un fichier, si oui le champs pseudo de la structure Client est mis à jour et après ben je voudrais bien créer une thread Partie qui gèrerait la partie de puissance 4 de deux clients (envoie du tableau, des demandes,etc via justement les sockets qui sont dans les structures des deux clients) mais je ne sais pas du tout comment faire, j'ai essayer plusieurs fois mais rien ne va.

Je ne sais pas trop comment faire avec les threads, faudrait créer une thread qui prend 2 threads en paramètres enfin je ne sais pas, surtout que une fois que la fonction connection est terminé, la thread courante retourne à l'endroit de l'appelle de celle-ci, c'est-à-dire au menu

voila une partie du code :

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
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
void connexion(Client *cl)
{
	rechercheFichier(cl); //demande de pseudo + vérification si présent dans fichier
	strcpy(attente,"Attente d'un adversaire...");
	char attente[35];
	//client "cl" dispo pour une partie
	//attente d'un adversaire s'il n'y en a pas ? donc sauvegarde de cl ? 
	//mais la thread qui correspond a cl va continuer... retourne au menu ci-dessous ??!!	
	//
    //?????
}
	
void menuIdentification(Client *cl) //METTRE MENU DANS UNE STRUCTURE ET N'ENVOYER QU'UNE STRUCTURE AU CLIENT
{
	int cont=0;
	strcpy(titre,"Identification : ");
	strcpy(choix1,"1) s'enregistrer : ");
	strcpy(choix2,"2) se connecter: ");
	strcpy(quit,"9) quitter : ");
	strcpy(proposition,"votre choix ? ");
	strcpy(ko,"choix incorrect, recommencez !!");
	strcpy(ok,"");
	while (true)
	{
		if (clientBanni==1){break;}
		if ( send(cl->NewSocket,(char*)&titre,20*sizeof(char),0) == SOCKET_ERROR ){WSAErreur("send",GetLastError()); getch(); exit(0);}
		if ( send(cl->NewSocket,(char*)&choix1,35*sizeof(char),0) == SOCKET_ERROR ){WSAErreur("send",GetLastError()); getch(); exit(0);}
		if ( send(cl->NewSocket,(char*)&choix2,35*sizeof(char),0) == SOCKET_ERROR ){WSAErreur("send",GetLastError()); getch(); exit(0);}
		if ( send(cl->NewSocket,(char*)&quit,20*sizeof(char),0) == SOCKET_ERROR ){WSAErreur("send",GetLastError()); getch(); exit(0);}
		if ( send(cl->NewSocket,(char*)&proposition,35*sizeof(char),0) == SOCKET_ERROR ){WSAErreur("send",GetLastError()); getch(); exit(0);}
		if ( recv(cl->NewSocket,(char*)&choix,sizeof(int),0) == SOCKET_ERROR ){WSAErreur("recv",GetLastError()); getch(); exit(0);}
		
		//je renvoie le choix au client pour qu'il lance la fonction correspondante
		if ( send(cl->NewSocket,(char*)&choix,sizeof(int),0) == SOCKET_ERROR ){WSAErreur("send",GetLastError()); getch(); exit(0);}
		if (choix == 9) {break;}
		else if (choix < 1 && choix > 2)
		{
			if ( send(cl->NewSocket,(char*)&ko,35*sizeof(char),0) == SOCKET_ERROR ){WSAErreur("send",GetLastError()); getch(); exit(0);}
			cont=0;
		}
		else 
		{
			if ( send(cl->NewSocket,(char*)&ok,35*sizeof(char),0) == SOCKET_ERROR ){WSAErreur("send",GetLastError()); getch(); exit(0);}
			if (choix == 1) {ecrireLoginPWD(cl);}
			else {connexion(cl);}
		}
	}
}

void ThreadClient(LPVOID pParam) //thread qui s'occupe du client
{
	DWORD psConn=*(DWORD*)pParam;

	STRUCTCONN sConn = *(STRUCTCONN*)psConn;
	SOCKET NewSocket=sConn.NewSocket;
	HANDLE hEvtThdStart=sConn.hEvtThdStart;
	HANDLE hEvtThdEnd=sConn.hEvtThdEnd;
	
	//initialisation de cl de type Client, qui va contenir le socket, l'ip et le pseudo
	Client cl;
	cl.NewSocket=NewSocket;
	cl.numThread=sConn.IdConn;
	strcpy(cl.ip,inet_ntoa(sincl.sin_addr));
	printf("\nVoici l'ip du client : %s",cl.ip);

	//WaitForSingleObject(hEvtThdStart,INFINITE);

	uFlagBlock=0;
	if ( ioctlsocket(NewSocket,FIONBIO,&uFlagBlock) == SOCKET_ERROR ){ WSAErreur("ioctlsocket",GetLastError()); encore=false; }
	
	clientBanni=0;
	ouvertureFichierUsers();
	menuIdentification(&cl); //menu avec le choix de s'enregister ou de se connecter ou de quitter
    printf ("\nSession du client termine !\n\n");
   
   //j'écris dans le fichier log que le client vient de terminer sa session
   char log[250];
   sprintf(log,"Session du client termine : IP = %s",cl.ip);
   ecrireLog(log);
   
   ouvertureFichierDataUsers();
   sauverDataUsers();
   
   //fermeture
   SetEvent(hEvtThdEnd);
}

enfin voila, j'espère que vous pourrez m'éclairer et solutionner mon problème, désolé le post est un peu long

Merci de votre attention.