Bonjour,

Je suis assez surpris de ce problème, n'utilisant pas encore de Thread, donc je voudrais savoir pourquoi il intervient.
J'envoie à un socket des données (connection au serveur FTp, User,Password,etc..), mais si je ne met pas quelquechose pour faire une pause (une fenêtre que l'utilisateur doit cliquer, par exemple), la connection au serveur se fait avant que celui-ci n'ai recu toutes les informations.
Il peut, par exemple, avoir récu la demande de connection, le nom d'User, mais pas le Mot de passe, ni ce qui suit ces instructions.
Si j'aurais utilisé des threads, j'aurait compris le problème, mais là, il est censé attendre qu'une instruction soit finie pour passer à une autre.
Surtout que j'utilise la fonction regarder qui regarde si le serveur ne me renvoie pas -1 après l'envoie du send(), donc....

Donc ma question est : comment obliger le serveur (ou le programme), à attendre que l'envoi des données soit effective avant de continuer ?

voici le 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
 
...
int rep=connect(sock, (sockaddr*)&sin, sizeof(sin));
...
std::ostringstream oss;
			oss<<"USER anonymous\r\n";//PASS a.a@msn.fr CWD ankamagam RETR Errata.txt";
			strcpy_s(TEMP,512,oss.str().c_str());
			int rep=send(sock, TEMP, (int)strlen(TEMP), 0);
			regarder(rep);
			//Sleep(20);
			//MessageBoxA(hDlg,"PASSEFtp 8","oidcvn",MB_OK);
			oss.clear();
			std::ostringstream oss1;
			oss1<<"PASS a.a@msn.fr\r\n";
			strcpy_s(TEMP,512,oss1.str().c_str());
			rep=send(sock, TEMP, (int)strlen(TEMP), 0);
			regarder(rep);
			//Sleep(20);
			//MessageBoxA(hDlg,"PASSEFtp 8","oidcvn",MB_OK);
			oss1.clear();
			std::string* res= new std::string[3];
			res=acceder(sock,1,hDlg,adr); //<-change de répertoire autant que besoin
			std::ostringstream oss03;
			oss03<<"TYPE I\r\n";//RETR DofusPatch_v1_18_0_to_v1_18_1.zip\r\n";//Dofus_v1_18_1.zip\r\n";
			strcpy_s(TEMP,512,oss03.str().c_str());
			rep=send(sock, TEMP, (int)strlen(TEMP), 0);
			regarder(rep);
			//Sleep(20);
			oss03.clear();
			std::ostringstream oss3;
			oss3<<"PASV\r\n";//RETR DofusPatch_v1_18_0_to_v1_18_1.zip\r\n";//Dofus_v1_18_1.zip\r\n";
			strcpy_s(TEMP,512,oss3.str().c_str());
			rep=send(sock, TEMP, (int)strlen(TEMP), 0);
			regarder(rep);
			//Sleep(20);
			if(incomplet) //permet de faire un reste si je fichier existe déjà
			{
				std::ostringstream oss6;
				oss6<<"REST  "<<EcritTotal<<"\r\n";//RETR DofusPatch_v1_18_0_to_v1_18_1.zip\r\n";//Dofus_v1_18_1.zip\r\n";
				strcpy_s(TEMP,512,oss6.str().c_str());
				rep=send(sock, TEMP, (int)strlen(TEMP), 0);
				regarder(rep);
				//MessageBoxA(hDlg,"PASSEFtp 8","oidcvn",MB_OK);
				oss6.clear();
			}
			//MessageBoxA(hDlg,"PASSEFtp 8","oidcvn",MB_OK);
			oss3.clear();
			std::ostringstream oss4;
			oss4<<"RETR "<<res[2]<</*DofusPatch_v1_18_0_to_v1_18_1.zip*/"\r\n\r\n";//Dofus_v1_18_1.zip\r\n";
			strcpy_s(TEMP,512,oss4.str().c_str());
			//MessageBoxA(hDlg,oss4.str().c_str(),"test",MB_OK);
			rep=send(sock, TEMP, (int)strlen(TEMP), 0);
			regarder(rep);
			//Sleep(20);
			//MessageBoxA(hDlg,"PASSEFtp 9","oidcvn",MB_OK);
			oss4.clear();
...
J'ai tenté :
-de mettre des Sleep(), mais le temps de réponse du serveur n'étant pas toujours le même, cela ne sert à rien.
-de mettre un listen(), mais ca ne change rien.
Il est impossible, je pense de mettre tout dans la même instruction, car je dois regarder la réponse de chaque appel, et un appel général ne me permettrait pas de les regarder.